728x90
반응형
안녕하세요, PSJ입니다.
오늘은 Java Application 개발 중 Server to Server 통신을 하는 경우가 간혹 있는데요. 이때 SSL(HTTPS) 통신을 하게 되는 경우도 많습니다.
일반적인 상황에 정상적인 인증서를 사용한다면 그냥 통신이 되어야하지만, 제 업무환경과 같은 내부망에 SSL 모니터링을 위한 설루션을 사용하거나, 사설 인증서를 사용하는 서버와 통신을 하는 경우에는 통신에 오류가 발생할 수 있습니다. 이를 해결하는 방법을 정리합니다.
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
오류의 원인은 Java는 SSL 통신을 수행할때 OS의 키 저장소가 아닌 자체 저장소를 활용하게 됩니다. 보통은 JRE 설치경로 하위에 'lib/security/cacerts'에 저장되는데요. 해당 저장소에 SSL 통신 시 사용되는 인증서 또는 중계기관 인증서가 등록되지 않아서 발생합니다.
방법은 간단합니다. Java Keytool을 이용해서 인증서를 등록해주면 됩니다.
먼저 현재 키저장소에 등록된 인증서 목록을 확인할 수 있습니다. (저장소의 기본 패스워드는 'changeit'인데, 보안상 변경을 권장합니다)
## 현재 KeyStore 등록된 인증서 목록 조회
$ keytool -list -keystore /usr/java/jre1.8.0/lib/security/cacerts
## KeyStore 기본 패스워드 'changeit'
Enter keystore password: changeit
# grep 명령을 연결해 alias 조회가능
$ keytool -list -keystore /usr/java/jre1.8.0/lib/security/cacerts | grep -i 'certname'
등록하려는 인증서가 없는 경우 등록해 주시면 되겠죠?
# 인증서 등록 (root 권한 필요)
# keytool -keystore /usr/java/jre1.8.0/lib/security/cacerts -importcerts -alias 인증서별칭 -file /경로/인증서.cer
Enter keystore password : changeit
Owner: CN=XXX ...
Issuer: CN=XXX ...
Serial number: XXXXXX ...
...
Signature algorithm name: SHA1withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
...
...
...
Trust this certificate? [no]: yes ## yes 입력!!
Cerificate was added to keystore
저장할 KeyStore와 인증서별칭, 인증서 파일을 입력하고 등록해 주시면 됩니다. 등록 시에는 관리자 권한이 필요합니다.
등록하려는 인증서 정보가 표시되고, 등록할건지 물어봅니다. 당연히 'yes' 입력해 주시면 등록이 완료됩니다.
이제 오류없이 통신이 잘 되실 겁니다.
이상입니다.
공감과 댓글은 큰 힘이 됩니다.
728x90
반응형
댓글