OkHttp 3.11和TLS 1.2支持

时间:2018-09-14 09:25:12

标签: java android okhttp tls1.2 okhttp3

在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是否安全?

1 个答案:

答案 0 :(得分:1)

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

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

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