android - 如何使用负载均衡器调试 TLS 协商失败?

标签 android ssl

我有一个 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/

相关文章:

javascript - JavaScript 中的 SSL 连接

android - RxJava(Kotlin)、Observable.amb 和 PublishSubject 未触发

javascript - 使用 React-Native 导航传递数据

SSL 证书未在 Google Cloud Console GKE 中更新

security - 与仅用于登录的 SSL 的安全通信?

java - CertPathValidator 和 CertPathBuilder 之间的概念区别是什么?

android - 在 ListView 中 flutter 两个ListView.builder

java - 在 Android 中解析和执行 HTML

android - 在 actionbarsherlock 中单击选项卡时调用新的 Activity 类

ssl - TLS 客户端证书 : which attribute for authorization?