我有一个 Android 应用程序,它通过 HTTP POST 请求与后端服务器通信。我想将它升级到 HTTPS。我使用的 API 是 HttpLib.postRequest。
我发现直接连接到我的 Apache 服务器工作正常。但是通过负载平衡器的连接不起作用。我的负载均衡器来自阿里云。我尝试了两种不同的负载均衡器,都以同样的方式失败。直接的症状是我在电话中收到“unknown_err”。
我可以使用 tcpdump 捕获流量,这证明它正在连接到正确的位置并尝试协商。 session 以客户端发送 HTTPS 错误“证书未知 (46)”结束。
通常这是由错误的证书或配置引起的。但我知道我的证书都是有效的。其他浏览器可以正常连接到同一台服务器以加载正常网页。同一个应用程序的 iOS 版本也可以正常工作。即使应用程序无法连接,在 Android 手机上浏览网站也能正常工作。网址是https://zaomengshe.com所以你可以在那里检查证书。我还有一个不同的设置,其中包含负载均衡器和来自 Let's Encrypt 的证书。
我猜阿里云的负载均衡器和 Android 的一些特殊性阻碍了成功的协商。也许我需要启用对某些算法或 key 大小或其他东西的支持。我读到直到 API 版本 20 才支持 TLS 1.2,所以我将支持的最低版本更新为 20。这没有帮助。
最佳答案
report by SSLLabs对于这个域明确地说:
This server's certificate chain is incomplete. Grade capped to B.
此问题的原因可能是负载均衡器的配置困惑:在 TLS 握手中仅提供叶证书,而不提供构建信任链所需的中间证书。桌面浏览器通常会尝试解决此类损坏的配置,但其他应用程序通常不会。
这意味着这很可能是您的申请失败的原因。并且还需要通过配置中间证书在负载均衡器上解决此问题。
关于android - 如何使用负载均衡器调试 TLS 协商失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48011135/