Java에서 https를 이용한 SSL 통신을 할 때 아래와 같은 이슈를 맞닥뜨리는 경우가 종종 있을 것이다.
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:105)
at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:159)
at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:922)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
... 8 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 16 more
인증서와 관련된 이슈로 여러 원인이 있을 수 있지만, 내가 겪은 이슈의 주요 원인은 통신하려는 서버의 인증서가 통신을 시도하는 자바 버전에서 신뢰할 수 있는 인증기관으로 인식되지 못해 발생하는 것이었다.
원인을 찾아가는 과정에서 알게 된 개념을 정리할 필요가 있어 글을 남긴다.
1. SSL 통신을 할 때는 인증서와 인증서를 발급한 인증기관의 유효성을 체크한다.
2. Java는 신뢰할 수 있는 인증기관(Certification Autority, CA) 목록을 버전별로 다르게 제공한다.
확인 방법은 아래와 같다. (default password : changeit)
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts
테스트 해봤을 때 jdk1.7.0_79 에서는 92개, jdk1.8.0_065에서는 93개의 인증기관 목록을 제공하고 있었다.
3. 신뢰할 수 있는 인증기관은 계속해서 늘어나고 있다. 변경된다.
4. 구 버전 Java는 배포 이후 늘어난변경된 인증기관 정보를 포함하고 있지 않다.
> 이러한 이유 때문에 신뢰할 수 있는 인증기관에서 발급 받은 인증서라 할지라도 신뢰할 수 없다고 처리되는 것이다.
문제 해결을 위해서는 keytool의 importcert를 이용하여 내 자바 버전에서 제공되는 인증기관 정보를 업데이트 시켜야 한다.
※ JDK 또는 JRE 버전을 업데이트 하는 경우 다시 인증기관 정보를 업데이트 해야함