SSL/TLS 에서 자주 겪는 에러는 다음과 같이 ValidatorException PKIX path building failed 입니다.
이 에러는 주로 통신 상대방이 사용하는 인증서의 CA 인증서가 내가 사용하는 keystore 에 등록되지 않았을 경우 발생합니다.
[Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
CODE
Portecle 는 Java 로 개발된 GUI 기반의 Key store 관리 유틸리티로 keytools 명령어에 익숙하지 않아도 keystore 에 인증서를 넣고 뺄 수 있습니다.
설치하려면 portecle 프로젝트 사이트 에서 다운로드후 압축을 해제 하고 다음 명령어로 실행하면 됩니다.
java -jar portecle.jar
JAVA
그러면 다음과 같은 프로그램이 표시됩니다.
CA 인증서 넣기
CA 인증서 추출
인증서를 넣으려면 먼저 상대의 인증서를 가져와야 하므로 메뉴에서 Examine SSL/TLS Connection: 을 선택합니다.
상대방의 host name 이나 IP 와 Port 번호를 넣고 OK 를 클릭합니다.
서버에서 CA 인증서를 같이 배포할 경우 상단의 우측 버튼(1)이 활성화되고 클릭할 경우 CA 인증서 정보를 볼 수 있습니다.
2번 Subject 는 인증서가 적용된 사이트 이름이고 3번 Issuer 는 발급자 (CA) 의 이름으로 Let's encrypt 를 사용하는 것을 알수 있습니다.
이제 상단의 다음 버튼을 클릭해서 CA 인증서 정보로 넘어간 후에 하단의 "PEM Encoding" 을 클릭합니다.
그러면 인증서 정보창이 뜨는데 Save 를 클릭해서 CA 인증서를 저장해 줍니다.
Key store 에 인증서 넣기
메뉴에서 File → Open Keystore File 을 선택합니다.
사용하는 JDK 나 JRE 경로(예: /usr/java/jdk11/) 로 간 후에 lib/security 폴더의 cacerts 파일을 선택하고 열기를 클릭합니다.
암호를 묻는 창이 뜨는 설정한 keystore 의 암호를 입력합니다. 별도로 설정한 적이 없다면 기본 암호인 changeit 을 입력합니다.
등록한 CA 인증서의 목록이 표시되는데 Tools → Import Trusted Certificate 메뉴를 선택합니다.
인증서 경로를 묻는 창에는 CA 인증서 추출 항목에서 저장한 인증서의 경로를 설정합니다.
key store 내 저장할 alias 를 묻는데 특별한 이유가 없다면 기본 값으로 설정하고 OK 를 누릅니다.
그러면 정상적으로 import 되었다는 메시지가 표시됩니다.
확인
오류가 나는 사이트에 java 로 연결해서 해결되었는지 확인해 보면 됩니다.
사용하는 JDK 나 JRE 가 업그레이드될 경우 매번 이 작업을 해줘야 합니다.(상대방이 사용하는 인증서 CA 가 JDK 에 포함되어 있으면 필요없습니다.)
같이 보기
Ref