【问题标题】:How to enable TLSv1.3 for OkHttp 3.12.x on Android 8/9?如何在 Android 8/9 上为 OkHttp 3.12.x 启用 TLSv1.3?
【发布时间】:2019-08-27 14:25:24
【问题描述】:

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

【问题讨论】:

  • 你打的是什么服务器?它有 TLSv1.3 吗?
  • @JesseWilson 这是一个支持 TLSv1.3 的 nginx 1.14.0/OpenSSL 1.1.1 安装。 Ubuntu 上的 Firefox 和 Android 上的 Chrome 都通过 TLSv1.3 连接。

标签: android okhttp tls1.3


【解决方案1】:

如官方link所示, TLSv1.3 从 Android 10(API 级别 29)开始受支持。因此,为了在以前的版本中支持 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 级别

【讨论】:

  • 如果我错了,请纠正我,来自 OkHttp Platform.kt 的代码建议不然。它将首先匹配 android,然后是 Conscrypt。 ConscryptPlatform 实例不会从 Android 设备上的方法 Platform.Companion.findPlatform 返回。
【解决方案2】:

问题很可能是,客户端或证书可能在所有情况下都不支持 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

【讨论】:

  • 我应该提到我已经运行了 SSL 测试和it passes TLSv1.3 测试。支持所有 TLSv1.3 密码套件:TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256 和 TLS_AES_128_GCM_SHA256。
  • @AndreasSchildbach(更新和/或)显式设置MODERN_TLSRESTRICTED_TLS 仍可能导致不同的协议协商。不知道默认值是什么。
  • 恐怕我无法更新到 OkHttp 3.13 及更高版本,因为 Square 对我的要求太高了(使用 Java 8 语言功能需要最近的 Android Gradle 插件,该插件会破坏确定性构建,因为长期存在的错误)。但是他们说 OkHttp 3.12.x 正在接收反向移植。
  • 我突然觉得 Android 9 还不支持 TLSv1.3,尽管我记得 2 年前读过它。我刚刚尝试运行SSLContext.getInstance("TLSv1.3");,但得到了java.security.NoSuchAlgorithmException: TLSv1.3 SSLContext not available。 Android Q(未发布)的更新日志确实 mention it 像一个新功能。
猜你喜欢
  • 2023-01-10
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多