首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么android会得到错误的ssl证书?(两个域,一个服务器)

为什么android会得到错误的ssl证书?(两个域,一个服务器)
EN

Stack Overflow用户
提问于 2014-02-22 15:58:25
回答 3查看 12.7K关注 0票数 18

我有两个域:foo.netbar.com。它们都有SSL证书,并且在所有桌面和移动浏览器中都能很好地工作。它们托管在配置有nginx的同一台服务器上。

但是,当我从本地android应用程序中向域发出请求时,它不知何故从错误的域获得了证书!这导致IO异常:

代码语言:javascript
复制
request = new HttpPost("https://foo.net/api/v1/baz");
request.setHeader("Authorization", "user:pass");
response = httpClient.execute(request);

..。

javax.net.ssl.SSLException: hostname in certificate didn't match: <foo.net> != <bar.com> OR <bar.com> OR <www.bar.com>

如果任何其他度量似乎都表明服务器配置正确,那么是什么原因导致android/java尝试使用来自bar.com的证书呢?在nginx访问或错误日志中没有出现任何内容。在我的安卓项目中,没有提到bar.com

编辑:我不知道为什么,但看来服务器正在为服务器IP bar.com https://198.245.xx.xxx使用证书

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-22 16:58:40

造成此问题的最可能原因是服务器使用服务器名称指示选择要发送的证书。如果客户端不支持SNI,则服务器无法在SSL/TLS握手期间(在发送任何HTTP通信之前)选择发送哪个证书。当您想在同一个IP地址和端口上使用多个证书时,SNI是必需的,但并不是所有客户端都支持它(众所周知,任何版本的Windows XP和许多移动浏览器都支持IE )。

您还明显地使用了Apache库(而不是HttpsURLConnection,而有些Android版本可以支持SNI。 )。Apache客户端库是最近的中对SNI的支持,当然还没有进入到Android堆栈中。

您可能会发现本文中描述的解决方法很有用(尽管它似乎只适用于Android 4.2+)。

另外两种选择是:

  • 如果您控制服务器,则为每个主机使用不同的IP地址(以免需要SNI),或
  • 使用另一个HTTP库(例如HttpsURLConnection)。
票数 29
EN

Stack Overflow用户

发布于 2017-02-21 11:33:19

Apache的一个解决方案,更像是一个技巧: SSL证书是基于启用/etc/apache2/site的vhost名称加载的。因此,要欺骗该检查,请确保首先加载有问题的证书(请记住,vhost是按名称加载的)。

票数 4
EN

Stack Overflow用户

发布于 2014-02-22 16:19:43

它看起来像是foo.net的证书配置错误,并且使用与bar.com相同的主机名。

尝试运行一个在线证书验证工具,比如https://www.digicert.com/help/ on foo.net,只是为了确保。

我认为您需要用正确的主机名重新生成foo.net证书,或者重新配置ngix,以确保nginx为正确的主机提供正确的证书。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21956663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档