Резервирование SSLSocketFactory и TrustManager в OkHttp3

В OkHttp3 следующее не рекомендуется [A]:

    sslSocketFactory(SSLSocketFactory sslSocketFactory) 

Он заменяется на [B]:

    sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager).

Вот мои вопросы:

  • Какая польза от X509TrustManager в [B]?

  • Каковы преимущества использования [B] вместо [A], когда TrustManager уже может быть указан при создании объекта SSLSocketFactory?

  • В https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html они говорят о том, чтобы избежать отражения при использовании [B], может кто-нибудь объяснить?


Больше информации:

При создании объекта SSLSocketFactory уже можно указать trustManager в

sslContext.init(KeyManager[] arg0, TrustManager[] arg1, SecureRandom arg2).

Например, я получаю объект SSLSocketFactory, выполнив:

public SSLSocketFactory getSSLSocketFactory() {
  SSLContext sslContext = SSLContext.getInstance("TLS");
  sslContext.init(getKeyManager(), getTrustManager(), new SecureRandom());
  return sslContext.getSocketFactory();
}

С getTrustManager () метод, который возвращает TrustManager [], который содержит сертификат сервера, которому клиент должен доверять.

Теперь, так как

sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager) 

ожидает от меня предоставления объекта X509TrustManager, я справляюсь с этим, выполняя:

OkHttpClient okClient = new OkHttpClient.Builder().sslSocketFactory(getSSLSocketFactory(), (X509TrustManager) getTrustManager()[0]).build();

Тем не менее, я чувствую, что это не то, как они ожидали, что мы будем его использовать. Так что любые отзывы приветствуются.

Благодарю.

0 ответов

Метод использует отражение. Причина указана в документации OkHttp:

/**
 * Sets the socket factory used to secure HTTPS connections. 
 * If unset, the system default will be used.
 *
 * @deprecated [SSLSocketFactory] does not expose its [X509TrustManager], which is
 *     a field that OkHttp needs to build a clean certificate chain. This method
 *     instead must use reflection to extract the trust manager. Applications should
 *     prefer to call `sslSocketFactory(SSLSocketFactory, X509TrustManager)`, 
 *     which avoids such reflection.
 */
Другие вопросы по тегам