본문 바로가기

JAVA

[JAVA] HTTPS 통신시 Java Cacerts 파일에 인증서 목록이 없어 SSLHandshakeException 발생

반응형

 

Java를 이용하여 외부 서비스와 HTTPS 통신시 Java Cacerts 파일 내 외부 서비스에서 사용하는 SSL 인증서 목록이 없을 경우 아래와 같은 에러가 발생할 수 있습니다.

javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.h: PKIX path building failed: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is:
    java.security.cert.CertPathValidatorException: The certificate issued by CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US is not trusted; internal cause is:
    java.security.cert.CertPathValidatorException: Certificate chaining error

 

Java Cacerts 파일에 인증서 목록을 추가 하기 위해서는 아래 방법을 통해 진행합니다.

 

1. OpenSSL를 이용하여 상대방 URL에서 사용하는 인증서 확인

- CN=DigiCert Global Root G2 인증서가 cacerts 파일에 있어야 합니다.

$ openssl s_client -connect [URL]:443

 

2. Java Keytool를 이용하여 cacerts 파일에 인증록 목록 확인

$ $JAVA_HOME/bin/keytool -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit -list -v

# test.txt 파일에 인증서 목록 저장
$ $JAVA_HOME/bin/keytool -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit -list -v > test.txt

 

3. InstallCert.java 생성

1) InstallCert.java 다운로드(구글링 통해 다운)

https://github.com/elerch/InstallCert/blob/master/InstallCert.java

 

2) InstallCert.java 컴파일

- *.class 파일이 생성됩니다.

$ $JAVA_HOME/bin/javac InstallCert.java

 

4. 상대방 인증서 다운로드

$ $JAVA_HOME/bin/java -cp ./ InstallCert [URL]

 

실행을 하면 마지막에 아래와 같은 부분이 나타나게 된다

Enter certificate to add to trusted keystore or 'q' to quit: [1]

1을 눌러서 인증서 저장

 

인증서를 저장하면 

 

Added certificate to keystore 'jssecacerts' using alias 'URL-1' jssecacerts 파일 생성

 

5. keytool를 이용하여 인증서 파일(cacertslist.cert) 생성

$ $JAVA_HOME/bin/keytool -exportcert -keystore jssecacerts -storepass changeit -file cacertslist.cert -alias URL-1

 

6. Java Cecerts 파일 백업 후 인증서 파일 등록

$ cp $JAVA_HOME/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts.bak

$ $JAVA_HOME/bin/keytool -importcert -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -file output.cert -alias URL-1

 

7. Java Keytool를 이용하여 cacerts 파일에 추가된 인증서 목록 확인

$ $JAVA_HOME/bin/keytool -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit -list -v

# test.txt 파일에 인증서 목록 저장
$ $JAVA_HOME/bin/keytool -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit -list -v > test.txt

 

8. 해당 Java를 참조하는 WAS 재기동 후 SSL 통신 확인

 

 

반응형