java - OkHttp3 中的 SSLSocketFactory 和 TrustManager 冗余

标签 java okhttp sslsocketfactory x509trustmanager

在 OkHttp3 中,以下内容已弃用[A]:

    sslSocketFactory(SSLSocketFactory sslSocketFactory) 

它被替换为 [B]:

    sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager).

这是我的问题:


更多信息:

在创建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[],其中包含客户端应该信任的服务器证书。 p>

现在,因为

sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager) 

期望我提供一个 X509TrustManager 对象,我通过以下方式处理:

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

但是,我觉得这不是他们期望我们使用它的方式。所以欢迎任何意见。

谢谢。

最佳答案

该方法使用反射。 OkHttp documentation 中说明了原因:

/**
 * 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.
 */

关于java - OkHttp3 中的 SSLSocketFactory 和 TrustManager 冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201876/

相关文章:

android - 如何从包含 Android 自动下载图片的 url 中读取图片?

android - Android Kotlin API请求|在gson流程之后访问列表

java - 如何解决 JDK 9+ 不支持 java.lang.UnsupportedOperationException : clientBuilder. sslSocketFactory(SSLSocketFactory)?

java - 同一个请求的不同执行时间

java - 如何在任何事务之外对任务进行排队

java - 使用java控制何时关闭HttpClient s3

ssl - java.security.cert.CertPathValidatorException : Trust anchor for certification path not found. 网络

java - 通过默认 SSLSocketFactory 创建的 Socket 发送密码是否安全?

java - Java中的URL解码日语字符等

java - 重新单击后取消选择 JCheckBox