OkHttp3中SSLSocketFactory和TrustManager的冗余性问题

9
在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[] 数组。
现在,由于...
sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager) 

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

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

然而,我感觉这不是他们期望我们使用它的方式。所以欢迎任何建议。
谢谢。
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接