SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed / java.lang.UnsupportedOperationException at InstallCert$SavingTrustManager.getAcceptedIssuers(installcert.java
general java 2014. 3. 11. 18:47MAC/ java 1.7에서 java를 이용해서 SSL 통신시 발생한 SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed 과 InstallCert.java에서 발생한 java.lang.UnsupportedOperationException at InstallCert$SavingTrustManager.getAcceptedIssuers(installcert.java:147) 를 해결하는 방법을 정리했다.
https 서버와 통신해야 하는 상황에서 인증서 없이 HttpsURLConnection 을 사용하면 SSLHandshakeException 이 발생한다.
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
신뢰할 수 있도록 인증서 파일을 java 디렉토리에 두어야 한다.
InstallCert.java 는 인터넷에 찾으면 다양하게 있다. 원래 소스는 http://blogs.sun.com/andreas/resource/InstallCert.java"
에 있었으나 더이상 운영되고 있지 않아서.. 여기에 올린다.
또한 인터넷에 떠도는 기존의 소스를 사용하면, 아래와 같은 Exception이 발생한다.
javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1842)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1825)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1346)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at InstallCert.main(installcert.java:63)
Caused by: java.lang.UnsupportedOperationException
at InstallCert$SavingTrustManager.getAcceptedIssuers(installcert.java:147)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAlgorithmConstraints(SSLContextImpl.java:926)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:872)
at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:814)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
그래서, http://infposs.blogspot.kr/2013_06_01_archive.html
에 있는 파일을 받아 사용하면된다. 변경된 내용은 다음과 같다.
private static class SavingTrustManager implements X509TrustManager {
...
public X509Certificate[] getAcceptedIssuers() {
//throw new UnsupportedOperationException();
return new X509Certificate[0];
}
..
}
변경된 파일은 다음과 같다.
이제는 저장소를 만들고 jdk/jre/lib/security 디렉토리 밑에 복사한다.
$ java InstallCert 1.1.1.1:8000
jssecacerts 파일이 생성됨
$ sudo cp jssecacerts /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/security/
그리고, HttpsURLConnection 을 이용한 서버를 연결하면 문제가 없다.
'general java' 카테고리의 다른 글
[mybatis]' select * .. query시, binding하는 java domain object 의 필드와 매핑되지 못할때 어떤 일이 벌어지는가? (0) | 2014.04.28 |
---|---|
mockito, junit, Hamcrest maven dependency 이용시 va.lang.NoSuchMethodError: org/hamcrest/Matcher.describeMismatch 처리 (0) | 2014.04.23 |
spring mvc 406 에러 - Not Acceptable (0) | 2014.03.04 |
[tomcat] setenv.sh (0) | 2014.02.12 |
Spring 3] multiple properties in spring context file (0) | 2013.11.28 |