개발하는 두부

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path build

by 뚜부니

HTTPS 통신 시도 중 인증서를 확인할 수 없으면 아래와 같은 오류가 발생합니다. 회사 내부망이여서 해당 문제가 발생한 듯 합니다.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path build

인증서를 다운로드 받고, 등록하면 해당 이슈는 해결됩니다.

참고로 Windows 10 환경에서 수행했습니다.

 

먼저, Github에 올려진 소스를 다운로드 받습니다.

curl -O https://gist.githubusercontent.com/lesstif/cd26f57b7cfd2cd55241b20e05b5cd93/raw/InstallCert.java

다운로드가 완료되면 소스를 컴파일 합니다.

javac InstallCert.java

InstallCert를 연결하려는 사이트 이름(api.routo.com)과 함께 실행합니다.

java -cp ./ InstallCert  xxx.xxx.xxx

# EX
java -cp ./ InstallCert  api.routo.com

서버가 2개의 인증서를 전송하며, 보통 아래에 있는게 CA 인증서입니다.

아래 이미지와 같이 2번째 인증서가 Let's Encrypt CA 인증서이므로 2번을 선택해서 저장합니다.

서버가 전송한 인증서 목록

저장이 완료되면 아래와 같은 메시지가 나옵니다.

Added certificate to keystore 'jssecacerts' using alias 'xxx.xxx.xxx-2'

# EX
Added certificate to keystore 'jssecacerts' using alias 'api.routo.com-2'

이제 생성된 keystore jssecacerts의 인증서를 output.cert라는 파일로 저장합니다.

keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert -alias xxx.xxx.xxx-2

# EX
keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert -alias api.routo.com-2

그 다음 JVM의 keystore에 CA 인증서를 추가합니다.

keytool -importcert -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -file output.cert -alias xxx.xxx.xxx.xxx-1

# EX
keytool -importcert -keystore /c/Program\ Files/Java/jdk1.8.0_202/jre/lib/security/cacerts -storepass changeit -file output.cert -alias api.routo.com-2

Git Bash로 실행했는데, 아래와 같은 질문이 뜨더라구요... 아무튼 y 누르면 완료됩니다.. 😅😅

 

🔗 참고

https://www.lesstif.com/java/java-pkix-path-building-failed-98926844.html

https://loonyhyun.tistory.com/entry/JAVA-인증서-추가

 

블로그의 정보

개발하는 두부

뚜부니

활동하기