Резервирование 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.
*/