2013-10-31 3 views
3

지오 트러스트가 서명 한 https 인증서가 있습니다. 모든 브라우저에서 내 사이트가 잘 열립니다. https를 통해 권한을 부여하는 앱과 대부분의 시간을 모두 OK. 그러나 때때로 사용자는 연결할 수없고 오류가 있습니다.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를 사용합니다. 그것은 임의의 OS 및 무작위 자바 업데이 트에서 발생, 나는 이유를 모르겠다. 때로는 발생하지 않지만 대개 사용자가 이러한 오류가 발생하면 도움을 줄 수 없습니다.

사용자 응용 프로그램이므로 사용자 키 저장소에 인증서를 추가 할 수 없습니다.

대상 URL은 auth.greencubes.org입니다 (빈 응답은 403을 반환해야 함). 사용자는이를 확인할 수 있습니다.

답변

1

그래서 내 사용자 중 한 명이 도움을 받아 문제를 발견했습니다. Kaspersky Antivirus (또는 다른 바이러스 백신/방화벽 일 수도 있고 ESET NOD 일 수도 있음)의 문제점은 SSL 인증서를 교체하여 암호화 된 연결을 검사하고 Kaspersky CA 인증서가 기본 Java 키 저장소에 없습니다 (바이러스 백신 설치시 생성됨) .

첫 번째 해결 방법은 암호화 된 연결 또는 검사 연결을 전혀 검사하지 않도록 설정 (웹 안티 바이러스 기능)하거나 바이러스 백신을 사용하지 않도록 설정하는 것입니다.

올바른 솔루션은 Antivirus의 CA 인증서가 바이러스 백신 자체로 추가 된 Windows의 KeyStore를 사용해보십시오. 그것은 JVM 매개 변수를 설정하여 수행 할 수 있습니다

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

또는이 코드를 실행하여 (그것은 "윈도우-ROOT"가 아니라 "윈도우 MY"해야합니다!) 때 메인에서 응용 프로그램 시작 ((바람직) 기능) : 당신은 그냥 윈도우 시스템 때문에 명령 줄 인수입니다 있는지 확인해야

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

범용 솔루션이 아닙니다.

이 코드는 윈도우 키 저장소가 존재하고 유효한지 확인하는 데 사용할 수 있습니다

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 
    } 
} 
관련 문제