2013-10-31 110 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 
    } 
} 
相关问题