【问题标题】:OkHttp 3.11 and TLS 1.2 supportOkHttp 3.11 和 TLS 1.2 支持
【发布时间】:2018-09-14 09:25:11
【问题描述】:

在 Android 4.2 中添加了对 TLS v1.2 的支持,但默认情况下未启用。通过向 OkHttp 客户端提供 custom SSLSocketFactory implementation,使用 OkHttp 3.x 很容易解决此问题:

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setSocketFactory(new MySSLSocketFactory());

在我的例子中,自定义套接字工厂正在设置启用的协议,如下所示:

private static final String[] TLS_PROTOCOLS = new String[]{ "TLSv1.1", "TLSv1.2" };

public MySSLSocketFactory(final KeyManager[] keyManagers, final TrustManager trustManager) throws KeyManagementException, NoSuchAlgorithmException {
  final SSLContext sslContext = SSLContext.getInstance(TLS);
  sslContext.init(keyManagers, new TrustManager[]{ trustManager }, null);
  // ...
}

// ...

private Socket enableTLSOnSocket(final Socket socket) {
  if (socket instanceof SSLSocket) {
    ((SSLSocket) socket).setEnabledProtocols(TLS_PROTOCOLS);
  }
  return socket;
}

在最新的 OkHttp 3.11 中我们可以阅读

修复:首选可用的 TLSv1.2。在某些较旧的平台上 必须选择加入 TLSv1.2

我试图检查相关的提交(可能是this one),但我不确定它是否解决了与自定义工厂相同的问题。

所以我的问题是:当 OkHttp 3.11+ 用于在旧 Android 设备上保持 TSL 1.2 使用时,删除自定义 SSLSocketFactory 是否安全?

【问题讨论】:

    标签: java android okhttp tls1.2 okhttp3


    【解决方案1】:

    我已经使用默认套接字工厂测试了最新 (3.11) OkHttp 版本

    final SSLContext sslContext = SSLContext.getInstance(TLS); sslContext.init(keyManagers, new TrustManager[]{ trustManager }, null); sslContext.getSocketFactory();

    不幸的是,即使 TLSv1.2 可用,它也不是首选。现在,我必须继续使用我自己的 SSLSocketFactory 实现,其中包括 TLSv1.2。

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 2016-09-12
      • 2016-02-11
      • 2020-04-10
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多