我正在开发一个 Android 应用程序,它将一些 HTTPS 请求发送到我们自己的 Web 服务器(Linux、Nginx、来自“Let's Encrypt”的 SSL zertificate)。
这些请求在我的测试设备(Android 4.2.2 和 Android 6.0.1)上运行良好,但在另一台设备(5.1.1)上,请求引发了异常:
无法验证主机名 [my_domain]
在我的浏览器中查看证书,它似乎工作正常,使用以下连接:
TLS 1.2 AES_128_GCM ECDHE_RSA
在网上搜索任何帮助后,我终于尝试应用自定义 SSLSocketFactory,它强制客户端使用密码套件 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(我的其他测试设备已使用它,该请求在该设备上有效)。
长话短说:然后该请求在任何设备上都有效,这表明连接不成功是客户端的错误。
所以现在我的问题:
为什么 SSL 验证在某些 Android 设备上有效,而在某些设备上无效?
为什么异常说无法验证主机名,而证书有效并且证书中所述的主机名是正确的?
将请求绑定到一个特定的密码套件是否不好?(查看这些列表,给定的密码套件应该可以在所有需要的 Android 设备(4.1.0 及更高版本)上使用)
我是 SSL 的新手,期待任何可以帮助我理解这一点的答案。