我在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迁移中获得的经验是,除了更新所有涉及的组件之外,我无需执行任何操作。
答案 0 :(得分:0)
问题很可能是客户端或证书在所有情况下均可能不支持TLS 1.3,然后回退。尝试运行SSL test进行验证(它还会对移动客户端执行检查,协商可能会有所不同)。也可以选择将OhHttp升级到3.13
或3.14
(很快)。这是change log。即使Android应该支持它,也需要配置客户端:
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS))
.build();
可能的值包括:RESTRICTED_TLS
,MODERN_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。