MAC/ 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];

        }


..

}


변경된 파일은 다음과 같다. 

InstallCert.java


이제는 저장소를 만들고 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 을 이용한 서버를 연결하면 문제가 없다. 




Posted by '김용환'
,