2013-10-31 79 views
3

我擁有由Geo Trust簽名的https證書。所有瀏覽器都打開我的網站。我的應用通過https授權,大部分時間都可以。但有時用戶無法連接並出現錯誤:SSLPeerUnverifiedException:未通過身份驗證的對等憑證有效證書

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(Unknown Source) 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:126) 
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572) 
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) 
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) 
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) 
at org.greencubes.downloader.Downloader.downloadFile(Unknown Source) 
at org.greencubes.lil.Launcher.<init>(Unknown Source) 
at org.greencubes.lil.Launcher.main(Unknown Source) 

最後一位用戶有Windows 7 x86和java 1.7_45u。它發生在隨機操作系統和隨機java更新,我不知道原因。有時候並沒有發生,但通常如果用戶有這樣的錯誤沒有任何幫助。

我無法將證書添加到用戶的鍵盤上,因爲這是用戶應用程序。

目標網址是auth.greencubes.org(空響應必須返回403),您可以檢查它。

回答

1

所以,我發現一個問題與我的一個用戶的幫助。問題在於卡巴斯基防病毒軟件(或者ESET NOD也可能是其他一些防病毒軟件/防火牆)通過替換SSL證書來檢查加密連接,而默認的java密鑰庫沒有卡巴斯基CA的證書(因爲它是在安裝防病毒程序時生成的) 。

第一種解決方案是禁用檢查加密連接或檢查連接(網絡防病毒功能)或禁用防病毒。

正確的解決方案是嘗試使用Windows的KeyStore,其中Antivirus的CA證書由防病毒自己添加。它可以通過設置JVM參數來完成:

-Djavax.net.ssl.trustStoreType=Windows-ROOT 

(它必須是 「Windows-ROOT」,而不是 「Windows的我」!)

,或者執行該代碼時,應用程序啓動(在main( )功能最好):

System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT"); 

你只需要確保它的Windows系統,所以命令行參數是不通用的解決方案。

該代碼可以用於確保Windows鍵存儲是存在並有效:

if(System.getProperty("os.name").toLowerCase().contains("windows")) { 
    try { 
     KeyStore ks = KeyStore.getInstance("Windows-ROOT"); 
     ks.load(null, null); 
     System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT"); 
    } catch(Exception e) { 
     // Ignore: windows keystore is bad, left default 
    } 
} 
相關問題