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 통신 확인
'JAVA' 카테고리의 다른 글
[JAVA] HTTP 통신간 지원하는 기본 TLS 버전 (0) | 2024.02.05 |
---|---|
[JAVA] java.io.IOException: User limit of inotify instances reached or too many open files (0) | 2023.12.28 |
[JAVA] Find the jar file where the class file is used (0) | 2023.12.20 |
[JAVA] JAR, WAR, EAR 정리 (0) | 2023.08.14 |
[JAVA] JAR(JAVA Archive) 정리 (0) | 2023.06.26 |