【问题标题】:SSLSocketFactory and TrustManager redundancy in OkHttp3OkHttp3 中的 SSLSocketFactory 和 TrustManager 冗余
【发布时间】:2019-04-11 14:46:15
【问题描述】:

在 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();

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

谢谢。

【问题讨论】:

    标签: java okhttp3 sslsocketfactory x509trustmanager


    【解决方案1】:

    该方法使用反射。原因在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.
     */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多