我有两个域:foo.net和bar.com。它们都有SSL证书,并且在所有桌面和移动浏览器中都能很好地工作。它们托管在配置有nginx的同一台服务器上。
但是,当我从本地android应用程序中向域发出请求时,它不知何故从错误的域获得了证书!这导致IO异常:
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使用证书
发布于 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+)。
另外两种选择是:
HttpsURLConnection)。发布于 2017-02-21 11:33:19
Apache的一个解决方案,更像是一个技巧: SSL证书是基于启用/etc/apache2/site的vhost名称加载的。因此,要欺骗该检查,请确保首先加载有问题的证书(请记住,vhost是按名称加载的)。
发布于 2014-02-22 16:19:43
它看起来像是foo.net的证书配置错误,并且使用与bar.com相同的主机名。
尝试运行一个在线证书验证工具,比如https://www.digicert.com/help/ on foo.net,只是为了确保。
我认为您需要用正确的主机名重新生成foo.net证书,或者重新配置ngix,以确保nginx为正确的主机提供正确的证书。
https://stackoverflow.com/questions/21956663
复制相似问题