Application Servers & Java
[장애 사례] javax.net.ssl.SSLHandshakeException: PKIX path building failed
midworker
2025. 5. 15. 18:51
반응형
[장애 사례] javax.net.ssl.SSLHandshakeException: PKIX path building failed
Spring 기반 애플리케이션에서 외부 HTTPS API를 호출할 때 다음과 같은 오류가 발생할 수 있습니다.
✅ 에러 메시지 요약
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
✅ 발생 원인
Spring의 RestTemplate
또는 HttpClient
등에서 HTTPS 연결 시,
신뢰할 수 있는 인증기관(CA)의 루트 인증서가 JVM에 등록되지 않았거나,
자체 서명된 인증서(Self-Signed Certificate)를 사용할 경우 위와 같은 오류가 발생합니다.
즉, JVM이 연결하려는 HTTPS 서버의 인증서를 신뢰하지 못하는 상황입니다.
✅ 재현 조건
RestTemplate
또는WebClient
로 HTTPS POST/GET 호출- 외부 URL 예:
https://hiossen.cn/eos-auth/oauth/token
- 서버 인증서가 JVM
cacerts
에 없거나 유효하지 않은 체인을 가짐
✅ 해결 방법
🔹 방법 1: 서버 인증서를 JVM TrustStore에 수동 등록
- 인증서 추출
openssl s_client -connect hiossen.cn:443 -showcerts
→ -----BEGIN CERTIFICATE-----
~ -----END CERTIFICATE-----
사이 복사
- 인증서 저장
vi hiossen.crt
# 위 내용을 붙여넣고 저장
- 인증서 등록
$JAVA_HOME/bin/keytool -importcert \
-file hiossen.crt \
-alias hiossen_cert \
-keystore $JAVA_HOME/lib/security/cacerts \
-storepass changeit
기본 TrustStore 비밀번호는
changeit
- 서버 재시작
🔹 방법 2: TrustManager를 우회하는 코드 사용 (개발/테스트 전용)
⚠️ 실제 운영에서는 보안상 위험하므로 사용 금지
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] certs, String authType) {}
public void checkServerTrusted(X509Certificate[] certs, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
🔹 방법 3: Spring RestTemplate에서 SSL 우회 설정 (비추천)
RestTemplate restTemplate = new RestTemplate(new HttpsClientRequestFactory(true));
→ 커스텀 ClientHttpRequestFactory
로 SSL 검증 우회 (테스트용)
✅ 마무리
이 오류는 SSL 인증서 신뢰 체인 문제이며,
외부 서버 인증서 등록 or JVM TrustStore 갱신으로 해결할 수 있습니다.
운영환경에서는 반드시 공인인증서 체인을 포함한 신뢰된 CA 인증서만 사용해야 하며,
Self-signed 인증서를 사용할 경우 JVM에 등록하거나 Vault 기반 키 관리를 고려하세요.
반응형