如何在Android 8/9上为OkHttp 3.12.x启用TLSv1.3?

时间:2019-04-05 16:09:34

标签: android okhttp tls1.3

我在Android 9(Pixel 2设备)上使用OkHttp 3.12.2,并尝试连接到运行OpenSSL 1.1.1的Nginx 1.14.0。 nginx具有TLSv1.3的功能,我在Ubuntu 18.04上的Firefox 66.0.2,Android 9上的Chrome 73.0和ChromeOS 72.0上对此进行了验证。

但是, OkHttp始终会协商TLSv1.2 。我还尝试设置RESTRICTED_TLS ConnectionSpec,但这没有帮助。

我没有找到有关如何使TLSv1.3在Android上运行的特定说明。我知道只有Android 8和9开箱即用支持TLSv1.3。我现在有那个限制。

我从较早的TLS迁移中获得的经验是,除了更新所有涉及的组件之外,我无需执行任何操作。

2 个答案:

答案 0 :(得分:0)

问题很可能是客户端或证书在所有情况下均可能不支持TLS 1.3,然后回退。尝试运行SSL test进行验证(它还会对移动客户端执行检查,协商可能会有所不同)。也可以选择将OhHttp升级到3.133.14(很快)。这是change log。即使Android应该支持它,也需要配置客户端:

OkHttpClient client = new OkHttpClient.Builder()
    .connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS))
    .build();

可能的值包括:RESTRICTED_TLSMODERN_TLS和(向后)COMPATIBLE_TLS

答案 1 :(得分:0)

如官方link所示, 病房的Android 10(Api级别29)支持TLSv1.3。因此,要在以前的版本中支持TLSv1.3,我们可以集成conscrypt库。 Conscrypt安全提供程序包括用于TLS功能的公共API。为此,我们必须添加依赖项,

dependencies {
  implementation 'org.conscrypt:conscrypt-android:2.2.1'
}

这里我们还需要OkHttp客户端,因为它支持conscrypt。

OkHttp中所述,

  

OkHttp使用您平台的内置TLS实现。在Java上   OkHttp平台还支持Conscrypt,它集成了BoringSSL   Java。如果是第一个安全性,OkHttp将使用Conscrypt   提供者。

在添加conscrypt依赖关系之后,我们只需在应用程序类中提及

Security.insertProviderAt(Conscrypt.newProvider(), 1);

这有助于提供支持并在较旧的android版本(Api级别<29)中启用TLS 1.3。