由于集成的 SSL 库版本不同,不同 Android 版本的默认 SSL/TLS 版本配置如下表:
Protocol | Supported (API Levels) | Enabled by default (API Levels) |
---|---|---|
SSLv3 | 1–TBD | 1–22 |
TLSv1 | 1+ | 1+ |
TLSv1.1 | 20+ | 20+ |
TLSv1.2 | 20+ | 20+ |
Android 版本与 API Level 之间的对应关系则如下表:
可穿戴设备的 KitKat Android 4.4W 占用了 API Leve 20。也就是说,对于 Android 手机/平板 等设备,在 Android 5.0 之前,最高支持的 SSL/TLS 版本为 TLSv1,而这个版本实际上是一个安全性并不是太好的版本,当前已经有许多网站配置为不再支持这种老版本的 SSL/TLS 。在用 Android 5.0 之前的设备,访问一些不再支持 TLSv1 及之前 SSL/TLS 版本的网站的时候,就会出现一些问题。
Android 4.4.4 的设备与支持 TLSv1 的 HTTP 服务器建立连接时,其 Client Hello 消息如下:
SSL/TLS 握手可以正常完成,连接能够建立成功,并顺利完成数据传输。
Android 4.4.4 的设备与最低支持 TLSv1.1 的 HTTP 服务器建立连接时,其网络包的交互则像下面这样:
第 4 号包是 TCP 连接建立完成后, Android 客户端发向服务器的 Client Hello 消息,但服务器立即就回了一个 Alert 消息,并关闭了 TCP 连接。此时,用于执行 HTTP 请求的 OkHttp 库也将抛出异常并退出,异常为:
在 Android 4.3、Android 4.2.2 和 Android 4.1.1 上,用相同版本的 OkHttp 访问前面配置为最低支持 TLSv1.1 的 HTTP 服务器时,抛出了完全相同的异常。
客户端版本低于服务器支持的最低 SSL/TLS 版本时,HTTPS 连接会在握手阶段失败。
参考文档
SSLEngine