为什么 HttpUrlConnection 在移动数据连接上抛出 SSLException?

2022-09-02 21:30:01

当使用Android的库发出HTTPS请求时,我有时会看到抛出以下异常:HttpUrlConnection

javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x5c1b18a0: I/O error during system call, Connection reset by peer
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395)
...

在深入研究了这个问题之后,我了解到

  • 在无线网络上一切都很好
  • 仅当设备处于移动数据连接状态时,才会引发异常
  • 首先通过wifi进行HTTPS之后,通过移动数据连接往往会在一段时间内正常工作
  • 问题似乎发生在少数特定的移动运营商上。

可能发生了什么?某些移动运营商是否会干扰 HTTPS 流量?


答案 1

简短的回答

事实证明,一些移动运营商将返回一个IP地址,用于DNS查找,该地址本应失败为不存在。应用连接到的服务器有时无法解析,运营商会尝试通过提供类似站点的页面来提供帮助。


更长的答案

我的应用连接到的服务器的主机名有时无法解析。这通常会引发 一个来指示 DNS 故障。我希望这种情况偶尔会发生,应用程序会处理它。这是一个反常现象。UnknownHostExceptionSSLException

在拦截失败的DNS查找的运营商上,将Web浏览器导航到不存在的主机将显示一个“搜索结果”页面,旨在帮助您找到所需的内容。(一些DLS/电缆ISP也这样做。但是,对于发出HTTPS请求的应用程序,这会中断SSL握手,因为远程主机与应用程序预期的不同。

根本原因是 DNS 服务器行为异常,该服务器将为我的应用正在使用的服务器之一返回不存在的主机错误。通过wifi连接似乎更可靠(由于同一DNS服务器的另一个怪癖)。通过wifi连接将允许缓存DNS条目,从而在我们随后通过移动数据连接进行连接时暂时掩盖了问题。但是,大多数情况下,移动运营商会拦截失败的DNS查找并将我们重定向到意外的主机名,从而导致SSL握手失败。


答案 2