android - HttpClient获取新域名后产生SSLException

标签 android ssl apache-httpclient-4.x

最近我获得了一个新域名,用于现有的 Android 应用程序。我还从受信任的 CA (Comodo) 购买了 SSL 证书。当我使用 Web 浏览器浏览到新域时,一切都按预期工作 - 没有关于 SSL 证书的错误。与 HttpUrlConnection 相同,但由于某些原因 Apaches HttpClient 生成 SSLException:

javax.net.ssl.SSLException: hostname in certificate didn't match: my.new.domain != my.old.domain OR my.old.domain

更有趣的是,我尝试使用的一些设备在更改后可以正常工作大约一周,然后就停止工作了。其他设备立即停止工作。

如果我在客户端代码中使用旧域名,一切正常。

我使用的是版本 4.3.3 from here Android 的 HttpClient。我意识到转换为 HttpUrlConnection 确实可以解决我的问题,但我对为什么会发生这种情况感兴趣 - HttpClient 从哪里获取旧域名?是服务器配置错误,还是 Apaches HttpClient 有某种内部 dns 缓存?使用新的模拟器实例进行测试会引发相同的异常,因此问题与缓存无关。

我自己的调查陷入困境 - 我所能找到的只是完全禁用主机名验证的说明,或自签名证书的说明。

最佳答案

这可能是因为 Apache HttpClient 不支持 SNI(服务器名称指示),您可以在同一个 IP 地址后面拥有多个证书。这意味着,它不会在 SSL 握手中发送目标主机名,因此服务器只有目标 IP 地址来决定它应该使用哪个证书,并且只使用 IP 的默认证书——这可能是错误的。

关于android - HttpClient获取新域名后产生SSLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24886771/

相关文章:

java - 使 Apache HttpClient 4.3 与 sslSocketFactory/HostnameVerifier 一起工作

android - RecycleView 的 PointToPosition 替代方案

android - Robolectric 3 的图书馆资源 - JodaTime

java - 使用 VAULT 配置 Wildfly 8.0.0 以加密 keystore 密码时出现无效的 Keystore 格式异常

java - 如何使用 Apache HttpClient 获得持久的 HttpConnection?

java - HTTP/1.1 401 HttpClient 4.1.1 需要授权

android - 使用自定义适配器监听 ListView 上的点击

android - Firebase 实时数据库 addChildEventListener 在应用重新打开时获取所有项目

ssl - 在 windows xp 和 IE8 上运行 SNI 支持站点的任何解决方法

android - 处理 Android Webview 中的证书错误并清除证书首选项