본문으로 바로가기

[Java] SSL Handshake 에러 해결

category etc. 2020. 7. 8. 21:55

 

Oracle Java 1.8.0 에서 OpenJDK JAVA 10 버전으로 JAVA 버전을 바꿔야되는 일이 있었는데,

 

해당 에이전트 서버가 웹 서버와 https 통신이 되지 않았다.

(인증서 파일 통해 TLS를 적용함)

 

 

문제 에러 로그는


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


 

위와 같은데, 인터넷을 찾아보니 아래와 같은 문제로 인해 발생된다고 한다.

 

1. 인증서 파일이 처음부터 신뢰할 수 있는 기관에서 발급받은 아니거나
2. 대중적으로 신뢰할 수 있는 기관이지만 Java에서 신뢰를 하지 못한다.
3. TLS 적용버전이 서로 다른 경우

 

 

Oracle Java에서는 가능하나, OpenJDK에서는 불가능한걸로 보아 2번 문제로 보이는데..

 

 

해결 방법은 JAVA에 속한 "cacerts" 파일에 ROOTCA 인증서를 import 해주는것이 가장 무난하다.

 

 

1. $JAVA_HOME/bin/ 경로로 이동

2. 해당 경로에서 cmd 창 실행

3. 아래 명령어의 변수를 본인환경에 맞추어 변경한 후 입력

  - root 인증서 파일 경로 : 자신의 RootCA 인증서 파일 경로

  - keystore 이후 : cacerts의 위치 > 보통 $JAVA_HOME/jre/lib/security/cacerts 에 위치

  - storepass 이후 : 초기 패스워드는 changeit 이다

keytool -import -file "root 인증서 파일 경로"
-keystore "C:\Program Files\java\jdk1.8.0_65\jre\lib\security\cacerts" 
-storepass "changeit"

4. 이 인증서를 신뢰합니까? [아니오] : 나오게 되면 'y' 입력

5. 인증서가 키 저장소에 추가되었습니다. => 완료

 

 

윈도우 기준으로 설명했지만, MAC도 동일하게 cacerts 파일에 import 해주면 된다.

(MAC은 /Library/Java/JavaVirtualMachine 에 자바가 있고 cacerts 도 이 안에 있을 것이다.)