【发布时间】:2017-01-06 16:43:53
【问题描述】:
我正在尝试使用 HttpClient 从我的代码访问网站:
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("https://www.datamed.org/search.php?query=gene&searchtype=data");
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
这是我得到的错误:
Exception in thread "main" javax.net.ssl.SSLException: hostname in certificate didn't match: <www.datamed.org> != <ucrexdc.ucsd.edu> OR <ucrexdc.ucsd.edu>
我从浏览器检查了证书,它似乎正确,名称正确。
不确定从哪里接收ucrexdc.ucsd.edu。
如果我使用代理,代码确实有效。 在 StackOverflow 上经历了很多类似的问题,但在大多数情况下,服务器都在用户的控制之下。就我而言,这是一个已经存在的网站。我只有这个网站有这个问题。
可能是我的环境有问题吗?
更新:
我发现两个网站(datamed.org 和 ucrexdc.ucsd.edu)具有相同的 IP,169.228.51.21。会不会有问题,为什么浏览器没有这个问题?
更新 2:
我使用的是 apache http-client 4.3.1,
当我更新到4.4.1 时,它得到了解决。该问题很可能与 SNI 有关。
【问题讨论】:
-
已经看到,它提出了一种解决方法,不应该在产品代码中使用。此外,我还想知道是什么导致了这种情况发生
-
@ScaryWombat 新手,在示例中没有看到任何 Keystore 代码。我可以在没有任何密钥库的情况下连接到 google.com。另外,datamed.org 不在我的服务器上。
-
浏览器可以正常工作,因为它支持 SNI (en.wikipedia.org/wiki/Server_Name_Indication)。您使用的是哪个版本的 Java?
-
@msbit 我正在使用 Java 1.8
标签: java apache-httpclient-4.x