상세 컨텐츠

본문 제목

Java PKIX path building failed

프로그래밍/Server

by 웰치스짱 2023. 5. 3. 14:26

본문

반응형

Spring 을 이용해서 원격지 서버 (https) 와 통신을 하다보면 아래와 같은 에러가 발생한다.

 

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target\n\tat sun.security.ssl.Alert.createSSLException(Alert.java:131)\n\tat sun.security.ssl.TransportContext.fatal(TransportContext.java:324)\n\tat sun.security.ssl.TransportContext.fatal(TransportContext.java:267)\n\tat sun.security.ssl.TransportContext.fatal(TransportContext.java:262)

 

대부분의 원인은 원격 사이트에서 사용하는 SSL 인증서 정보가 현재 구동중인 JVM에 신뢰하는 인증기관 목록에 등록되어있지 않기 때문입니다. 따라서 해당 JVM의 keystore에 인증서를 넣어주고 재 구동을 하면 됩니다. 

 

아래와 같이 따라해 봅시다.

 

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

 

인증에 필요한 파일을 curl을 통해서 다운로드 받고 소스파일을 컴파일 합니다.

완료되면 아래와 같이 해당 사이트를 위한 인증서를 추출합니다.

 

java -cp ./ InstallCert korean.go.kr

 

그럼 서버에 등록된 인증서가 나옵니다.

 

Loading KeyStore /Users/bkkwon/Library/Java/JavaVirtualMachines/azul-17.0.7/Contents/Home/lib/security/cacerts...
Opening connection to opendict.korean.go.kr:443...
Starting SSL handshake...

Server sent 1 certificate(s):

 1 Subject CN=*.korean.go.kr, O=National Institute of Korean Language, L=Gangseo-gu, ST=Seoul, C=KR
   Issuer  CN=Thawte RSA CA 2018, OU=www.digicert.com, O=DigiCert Inc, C=US
   sha1    3a 8b 90 8b 70 eb b6 7d e1 b7 fe ca e7 20 d4 6a 74 26 6d bf 
   md5     ce 73 29 43 ea ac 57 02 39 72 d1 55 a4 a9 17 69 

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

인증서를 선택하고 엔터를 누릅니다.

인증과정을 거쳐 마지막에 아래와 같은 메시지가 출력됩니다.

 

Added certificate to keystore 'jssecacerts' using alias 'opendict.korean.go.kr-1'

그럼 다시 지정된 alias를 사용하여 아래와 같이 output.cert 파일을 생성합니다.

 

keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert -alias opendict.korean.go.kr-1

 

이제 마지막 과정으로 생성된 output.cert파일을 이용하여 아래와 같이 설정합니다. (사용될 JDK버전에 맞는 위치를 지정해야 합니다.)

 

keytool -importcert -keystore /Users/xxxx/Library/Java/JavaVirtualMachines/azul-17.0.7/Contents/Home/lib/security/cacerts -storepass changeit -file output.cert -alias opendic

 

마지막으로 인증서를 신뢰하느냐고 물어보면 y를 눌러줘서 키 인증소에 저장하면 됩니다.

 

이후에 서버를 재기동하여 테스트 해보면 정상적으로 사용이 되는 것을 알수 있습니다.

반응형

관련글 더보기

댓글 영역