我想從我的代碼訪問網站使用的HttpClient: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上經歷了很多類似的問題,但在大多數情況下,服務器都在用戶的控制之下。就我而言,這是一個已經存在的網站。我只有這個網站有這個問題。
它可能是我的環境問題嗎?
UPDATE:
我發現這兩個網站(datamed.org
和ucrexdc.ucsd.edu
)具有相同的IP,169.228.51.21
。它可能是一個問題,爲什麼瀏覽器沒有這個問題?
更新2:
我使用Apache http-client 4.3.1
,
當我更新到4.4.1
,它被解決。這個問題最可能與SNI有關。
這可能幫助http://stackoverflow.com/questions/2642777/trusting-all-certificates-using-httpclient-over-https – nullpointer
所看到的,它表明一個解決辦法,這不應當被使用prod代碼。此外,我也想知道是什麼導致這種情況發生 – gaurav5430
@ScaryWombat新來的這個,沒有看到在例子中的任何Keystore代碼。我可以在沒有任何密鑰庫的情況下連接到google.com。另外,datamed.org不在我的服務器上。 – gaurav5430