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에 수동 등록

  1. 인증서 추출
openssl s_client -connect hiossen.cn:443 -showcerts

-----BEGIN CERTIFICATE----- ~ -----END CERTIFICATE----- 사이 복사

  1. 인증서 저장
vi hiossen.crt
# 위 내용을 붙여넣고 저장
  1. 인증서 등록
$JAVA_HOME/bin/keytool -importcert \
 -file hiossen.crt \
 -alias hiossen_cert \
 -keystore $JAVA_HOME/lib/security/cacerts \
 -storepass changeit

기본 TrustStore 비밀번호는 changeit

  1. 서버 재시작

🔹 방법 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 기반 키 관리를 고려하세요.


반응형