2009-11-26 49 views
20

嘗試使用https連接到服務器時,出現'HTTPS hostname wrong:'錯誤。我的URL看起來像這樣HTTPS主機名錯誤:應該是<sub.domain.com>。這是什麼原因?

https://sub.domain.com/tamnode/webapps/app/servlet. 

東西我連接使用下面的代碼

// Create a URLConnection object for a URL 
    URL url = new URL(requestedURL); 
    HttpURLConnection.setFollowRedirects(false); 

    // connect 
    connection = (HttpURLConnection) url.openConnection(); 
    connection.setDoOutput(true); 
    connection.setRequestProperty("User-Agent", USER_AGENT); //$NON-NLS-1$ 

    OutputStreamWriter wr = new OutputStreamWriter(connection 
      .getOutputStream()); 

但隨後得到一個錯誤

IOException: HTTPS hostname wrong: should be <sub.domain.com>. 
    at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing 
    .... 

這是在過去的工作,但不再碼。系統架構發生了一些變化,但在接近責任人之前我需要獲取更多數據。

什麼會導致此錯誤?我可以關閉URLSpoofing檢查嗎?

回答

16

它看起來像domain.com的SSL證書已經給sub.domain.com。或者,更有可能的是,domain.com已更名爲sub.domain.com而未更新SSL證書。

13

cletus是正確的關於可能的原因。

還有就是關掉欺騙檢查,太辦法。

您可以創建一個實現HostnameVerifier返回下比「平常」更多,情況也是一樣的對象。

你會通過在問題的代碼連接對象上調用setHostnameVerifier替換默認的HostnameVerifier。

這個答案「啓發」:http://www.java-samples.com/showtutorial.php?tutorialid=211

我發現這個查詢鏈接:http://www.google.com/search?q=https+hostname+wrong+should+be

還要說明一點:在這之前三思而後行。您將在客戶端和服務器組件之間的安全性中創建可利用的弱點。

+0

2個oracle鏈接被破壞 – 2012-05-16 12:39:16

+0

@ stuart-siegler:謝謝你的支持。 – vkraemer 2012-05-16 18:39:42

+0

HostnameVerifier技巧爲我工作 – nilesh 2013-09-02 15:34:44

8

我得到這個例外 - java.io.IOException: HTTPS hostname wrong: should be <localhost>

我的解決方案是我更改了我的自簽名證書並製作了CN=localhost

OR

添加您的證書域名cn=<domain-name>到可能位於C本主機文件:/窗/ SYSTEM32 /驅動器的/ etc/...

+0

謝謝。使CN = localhost像魅力一樣工作! – siddagrl 2012-08-10 13:29:14

3

氏解決我的問題

static { 
    //for localhost testing only 
    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
    new javax.net.ssl.HostnameVerifier(){ 

      @Override 
     public boolean verify(String hostname, 
       javax.net.ssl.SSLSession sslSession) { 
      if (hostname.equals("your_domain")) { 
       return true; 
      } 
      return false; 
     } 
    }); 
} 
+0

你不應該寫代碼'僅用於測試'。它不可避免地泄漏到生產中並危及系統的安全。 – EJP 2018-02-25 22:25:15

相關問題