TLSバージョン1.2のサポートは、Android 4.2で追加されましたが、それはデフォルトで有効になっていませんでした。この問題は、提供することで、OkHttp 3.xではでは非常に簡単修正にしたカスタムのSSLSocketFactory実装を OkHttpクライアントに:
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に必要です
私は、関連するコミット(おそらくチェックするためにしようとしていたこの1を)しかし、それはカスタム工場が行うように同じ問題に対処している場合、私はわかりません。
だから、私の質問は: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は、それが利用可能であっても好ましいものではありません。今のところ、私はTLSv1.2が含まのSSLSocketFactoryの私の独自の実装を使用して維持する必要があります。