Android在OKHttp中启用TLSv1.2

Bha*_*ina 18 ssl android okhttp

我正在使用OKHttp进行我的项目.我想为我的服务电话启用TLSv1.2.任何人都可以告诉我如何启用它.

Rob*_*ert 9

据我所知,OKHttp不包含自己的SSL/TLS库,因此它只使用Android提供的标准SSLSocket.

支持(和启用)的TLS版本取决于使用的Android版本.在某些手机上支持TLS 1.2但默认情况下未启用.在这种情况下,您可以通过实现自定义包装器SSLSocketFactory来启用它,该包装器在内部使用默认的SSLSocketFactory并setEnabledProtocols(new String{"TLS1.2"})在每个创建的Socket上调用.


Jes*_*son 8

请参阅OkHttp的HTTPS文档.

ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) 
  .tlsVersions(TlsVersion.TLS_1_2)
  .cipherSuites( 
     CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
     CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
     CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
  .build();
OkHttpClient client = ... 
client.setConnectionSpecs(Collections.singletonList(spec));
Run Code Online (Sandbox Code Playgroud)

  • 正如文档所说 - 这只适用于Android 5.0或更高版本 (4认同)
  • 它甚至无法在 Android 5.0 上运行。我收到 SSL HandshakeException。 (3认同)

wei*_*ang 6

检查我的代码!!工作完美!

private void checkTls() {
    if (android.os.Build.VERSION.SDK_INT < 21) {
        try {
            ProviderInstaller.installIfNeededAsync(this, new ProviderInstaller.ProviderInstallListener() {
                @Override
                public void onProviderInstalled() {
                }

                @Override
                public void onProviderInstallFailed(int i, Intent intent) {
                }
            });
        } catch (Exception e) {
            finish();
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不适用于所有人。ProviderInstaller 类来自 Google Play Services,Google Play Services 并非在每个 Android 设备上都可用。最显着的是在中国,那里不允许使用 GPS。 (5认同)
  • 在调用 Web 服务之前使用它。只需要在您的应用中调用一次 (2认同)