hoon's bLog

Java Error | javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 본문

IT/Error

Java Error | javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

개발한기발자 2023. 1. 30. 20:46
반응형

Error 발생 경로

회사에서 기상청 OpenAPI를 붙여 코딩하는 도중, 다음과 같은 Error가 발생!!(OS환경 : Mac OS)

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

대충 해석해보자면, 인증서 경로를 찾을수 없다?! 라고 나오는데,

구글링을 해보니 통신하려는 서버의 인증서가 통신을 시도하는 자바 버전에서 신뢰할 수 있는 인증기관으로

인식되지 못해 발생하는 것이었다.

 

그래서 Stackoverflow에서 제시한 방법을 통해 해결해 봤다!

 

1. 브라우저에서 URL로 이동

Firefox

HTTPS 인증서 체인(URL 주소 바로 옆에 있는 자물쇠 아이콘)을 클릭하여 이름을 선택하고,

("more info" > "security" > "show certificate" > "details" > "export..")

파일 형식 "파일명.cer"로 설정한다.

 

Chrome

주소 표시줄의 주소 왼쪽에 있는 사이트 아이콘을 클릭하고 "인증서" -> "세부 정보" -> "내보내기"를 선택하고,

"Der-encoded 바이너리, 단일 인증서" 형식으로 저장!

마찬가지로 파일 형식 "파일명.cer"로 설정한다.

 

2. cacerts(key 저장소 파일) 경로 확인

[Window]
C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

[Mac OS]
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/lib/security/cacerts.

 

3. 아래 명령어를 통해 "파일명.cer" 파일을 cacerts로 Import!

(관리자 명령 프롬프트 or Terminer 필요!)

[Windows]
keytool -import -alias example -keystore  "C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts" -file example.cer

[Mac OS]
sudo keytool -import -alias weather-ca -keystore "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/lib/security/cacerts" -file weather-ca.cer

패스워드를 물어보면 "changit" 입력! 후 정상적으로 등록!

 

결론

이렇게 Error를 해결하는 과정에서 다음과 같은 정보도 알게 되었다.

  • SSL 통신을 할 때는 인증서와 인증서를 발급한 인증기관의 유효성을 체크한다.
  • Java는 신뢰할 수 있는 인증기관(Certification Autority, CA) 목록을 버전별로 다르게 제공한다
  • 신뢰할 수 있는 인증기관은 계속해서 변경된다.
  • 구 버전 Java는 배포 이후 변경된 인증기관 정보를 포함하고 있지 않다.

이러한 이유 때문에 신뢰할 수 있는 인증기관에서 발급 받은 인증서임에도 불구하고,

신뢰할 수 없다고 처리되는 Error가 발생 했던 것이다!!!!!!


SSL 통신을 함에 있어, 문제 해결을 위해서는 keytool의 importcert를 이용하여,

Java 버전에서 제공되는 인증기관 정보를 업데이트 해야 한다.
(JDK 또는 JRE 버전을 업데이트 하는 경우 다시 인증기관 정보를 업데이트 해야함)

 

정말이지... Error가 나고, 그 Error를 찾으면서 얻어지는 정보들은 정말 신세계 그 자체다.

Stackoverflow의 누군가는 이런 정보를 백지상태에서 정보를 얻으며 시간을 보냈을텐데,

이렇게나 친절하게 정리해서 찾아주고 올려줌에 감사하다!...

나도 누군가에게 도움이되고, 내가 배운 것들을 같이 공유하며 나누는 그 날까지,

열심히 정리하고 기록하겠다!

 

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

 

끝:)

 

참조 : https://stackoverflow.com/questions/21076179/pkix-path-building-failed-and-unable-to-find-valid-certification-path-to-requ

 

"PKIX path building failed" and "unable to find valid certification path to requested target"

I'm trying to get tweets using twitter4j library for my java project which uses under the covers java.net.HttpURLConnection (as can be seen in stack trace). On my first run I got an error about

stackoverflow.com

 

728x90
반응형