OkHttp 3.11 和 TLS 1.2 支持
OkHttp 3.11 and TLS 1.2 support
在 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我们可以阅读
Fix: Prefer TLSv1.2 where it is available. On certain older platforms
it is necessary to opt-in to TLSv1.2
我试图检查相关提交(可能 this one),但我不确定它是否解决了与自定义工厂相同的问题。
所以我的问题是:当 OkHttp 3.11+ 用于在旧 Android 设备上保持 TSL 1.2 使用时,删除自定义 SSLSocketFactory 是否安全?
我已经使用默认套接字工厂测试了最新 (3.11) OkHttp 版本
final SSLContext sslContext = SSLContext.getInstance(TLS);
sslContext.init(keyManagers, new TrustManager[]{ trustManager }, null);
sslContext.getSocketFactory();
遗憾的是,尽管 TLSv1.2 可用,但它并不是首选。现在,我必须继续使用我自己的 SSLSocketFactory 实现,其中包括 TLSv1.2。
在 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我们可以阅读
Fix: Prefer TLSv1.2 where it is available. On certain older platforms it is necessary to opt-in to TLSv1.2
我试图检查相关提交(可能 this one),但我不确定它是否解决了与自定义工厂相同的问题。
所以我的问题是:当 OkHttp 3.11+ 用于在旧 Android 设备上保持 TSL 1.2 使用时,删除自定义 SSLSocketFactory 是否安全?
我已经使用默认套接字工厂测试了最新 (3.11) OkHttp 版本
final SSLContext sslContext = SSLContext.getInstance(TLS);
sslContext.init(keyManagers, new TrustManager[]{ trustManager }, null);
sslContext.getSocketFactory();
遗憾的是,尽管 TLSv1.2 可用,但它并不是首选。现在,我必须继续使用我自己的 SSLSocketFactory 实现,其中包括 TLSv1.2。