【发布时间】:2019-04-11 14:46:15
【问题描述】:
在 OkHttp3 中,不推荐使用以下内容[A]:
sslSocketFactory(SSLSocketFactory sslSocketFactory)
替换为[B]:
sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager).
这是我的问题:
[B]中的X509TrustManager有什么用?
使用 [B] 而不是 [A] 的优势是什么?创建 SSLSocketFactory 对象时已经可以指定 TrustManager?
在https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#sslSocketFactory-javax.net.ssl.SSLSocketFactory- 他们谈到在使用 [B] 时要避免反射,有人可以解释一下吗?
更多信息:
在创建SSLSocketFactory对象时,已经可以在
中指定trustManagersslContext.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[],其中包含客户端应该信任的服务器证书。 p>
现在,因为
sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager)
希望我提供一个 X509TrustManager 对象,我通过以下方式处理:
OkHttpClient okClient = new OkHttpClient.Builder().sslSocketFactory(getSSLSocketFactory(), (X509TrustManager) getTrustManager()[0]).build();
但是,我觉得这不是他们期望我们使用它的方式。所以欢迎任何意见。
谢谢。
【问题讨论】:
标签: java okhttp3 sslsocketfactory x509trustmanager