2011-12-08 57 views
2

我試圖建立與https url的連接,但由於它仍在測試中,因此url重定向到測試環境,導致瀏覽器提示用戶發出一條消息,粗略地說明該證書是可信的,有效的,但與域名不匹配,並且如果他們想繼續。我很難在Java中處理這個問題。我發現的所有答案建議使用這樣的TrustManager在Java SSL連接中忽略「證書名稱錯誤」類型錯誤

TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
    public X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 

    public void checkClientTrusted(X509Certificate[] certs, String authType) { 
     return; 
    } 

    public void checkServerTrusted(X509Certificate[] certs, String authType) { 
     return; 
    } 
}}; 

sslContext.init(kmf.getKeyManagers(), trustAllCerts, new SecureRandom()); 

但是這並沒有改變任何東西。

身份驗證涉及在讀取客戶端證書的私鑰時輸入密碼,並且這種身份驗證在瀏覽器和我的應用程序中的工作方式相同且正確,在此身份驗證之後,瀏覽器彈出或連接返回'bad_certificate'錯誤在我的應用程序中。是否有其他方法可以完全忽略域驗證或者使相同的提示出現?

爲了清楚起見,我的應用程序不會導致出現密碼提示,因爲我編寫了它或任何東西,我認爲它只是來自窗口檢測我的應用程序試圖訪問證書的私鑰,所以我會假設第二個提示會以類似的方式工作,但我還沒有找到任何參數來實現這一點。

回答

0

讓我警告你,如果你這樣做是爲了測試你的代碼,那麼這不是正確的做法。瀏覽器經常忽略這些錯誤,並提示用戶是否想要儘管出現問題仍然繼續。如果他決定繼續,那麼他擁有這個決定。 在您的Java應用程序中,如果您使用的是JDK提供的默認SSLSocketFactory,那麼僅在SSL握手成功時纔會建立SSL會話。這是出於安全原因。如果你需要一個像瀏覽器一樣的功能,不管安全問題如何進行,您需要擁有自己的自定義實現。或者更好的是不要使用SSL。

+0

這是一個有效的警告。然而,我已經低估了這個不作爲答案:有些情況下,Java代碼需要連接到合法的HTTPS URL,其中Java代碼(如任何好的瀏覽器)告訴用戶「證書中的名稱X不匹配主機名Y在URL中「,以及用戶想要建立連接的位置。 –

0

有一些其他的方式來忽略該域驗證...

是。見Java的HostnameVerifier接口:

在握手,如果URL的主機名和服務器的 標識主機名不匹配,該驗證機構可以調用 回到這個接口的實施者,以確定是否該連接 應該被允許。