19

我在 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 迁移中获得的经验是,除了更新所有涉及的组件外,我不需要做任何事情。

4

2 回答 2

25

如官方链接所示,从 Android 10(Api Level 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。

于 2019-12-15T17:05:15.250 回答
8

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

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

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

于 2019-04-06T18:54:45.227 回答