【问题标题】:Why is HttpUrlConnection throwing an SSLException while on a mobile data connection?为什么 HttpUrlConnection 在移动数据连接上抛出 SSLException?
【发布时间】:2012-10-04 19:32:48
【问题描述】:

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

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 上一切正常
  • 该异常仅在设备处于移动数据连接时引发
  • 首先通过 wifi 建立 HTTPS 后,通过移动数据连接在一段时间内往往可以正常工作
  • 问题似乎发生在少数特定移动运营商上

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

【问题讨论】:

    标签: java android ssl android-networking


    【解决方案1】:

    简答

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


    更长的答案

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

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

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

    【讨论】:

    • 那么这不是移动连接的问题,而是连接提供商的问题。我会将问题更改为“HttpUrlConnection throwing an SSLException due to UnknownHostException”(可能添加“由于软 404”)。
    • 虽然根本原因确实是连接提供者,但我认为重新表述该问题会使其在相同情况下不易被其他人发现。我用我第一次遇到问题时提出的问题(即在我知道这是软 DNS 故障之前)提出问题的方式。
    • @acj 知道对 Google 来说什么是问题的一半。
    • 如何在应用中处理?
    • @preetha 就我的目的而言,请求失败并向用户显示友好消息就足够了。稍等片刻后,您或许可以再试一次,并希望下一次尝试成功。
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多