How to enable TLSv1.3 for OkHttp 3.12.x on Android 8/9?

And*_*ach 5 android okhttp tls1.3

I'm using OkHttp 3.12.2 on Android 9 (Pixel 2 device) and try to connect to an nginx 1.14.0 running with OpenSSL 1.1.1. The nginx is capable of TLSv1.3, I verified this with Firefox 66.0.2 on Ubuntu 18.04, Chrome 73.0 on Android 9 and ChromeOS 72.0.

However, OkHttp always negotiates TLSv1.2. I also tried to set a RESTRICTED_TLS ConnectionSpec, but it didn't help.

I did not find a specific instruction on how to get TLSv1.3 working on Android. I know that only Android 8 and 9 support TLSv1.3 out of the box; I'm fine for now with that restriction.

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

use*_*768 23

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

dependencies {
  implementation 'org.conscrypt:conscrypt-android:2.2.1'
}
Run Code Online (Sandbox Code Playgroud)

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

OkHttp 中所述

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

添加conscrypt依赖后,在application类中我们只需要提一下,

Security.insertProviderAt(Conscrypt.newProvider(), 1);
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ler 8

问题很可能是客户端或证书在所有情况下都可能不支持 TLS 1.3 - 然后会回退。尝试运行SSL 测试来验证(它还对移动客户端执行检查,这可能会以不同的方式进行协商)。将 OhHttp 升级到3.133.14(很快)也可能是一种选择;这是更改日志。即使Android应该支持它,客户端也需要配置,以及:

OkHttpClient client = new OkHttpClient.Builder()
    .connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS))
    .build();
Run Code Online (Sandbox Code Playgroud)

可能的值有:RESTRICTED_TLS,MODERN_TLS和 (backwards) COMPATIBLE_TLS