PKIX Path Building Failed 오류란 무엇인가? Java 개발자가 가장 많이 만나는 SSL 오류 완전정복
Java 개발을 하다 보면 언젠가는 반드시 만나게 되는 오류가 있습니다.
PKIX path building failed
처음 보는 개발자는 당황합니다.
PKIX?
Path?
Building?
도대체 무슨 뜻인지 알기 어렵습니다.
하지만 SSL/TLS의 원리를 이해하면 생각보다 어렵지 않습니다.
오늘은 Java 개발자가 가장 많이 만나는 SSL 오류인 PKIX Path Building Failed에 대해 쉽게 설명해보겠습니다.
실제 오류 메시지
보통 아래와 같은 형태로 나타납니다.
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
처음 보면 상당히 무섭게 느껴집니다.
하지만 사실 의미는 매우 단순합니다.
한 줄로 설명하면?
이 오류는
"상대방 서버의 인증서를 믿을 수 없어서 HTTPS 연결을 거부했다"
라는 뜻입니다.
실생활로 이해하기
여러분이 은행 창구에 갔다고 생각해보겠습니다.
직원이 말합니다.
제가 은행 직원입니다.
그럼 여러분은 무엇을 확인할까요?
아마도 직원증을 확인할 것입니다.
직원이 직원증을 보여줍니다.
이 직원증은 우리 은행이 발급했습니다.
그런데 직원증이
동네 문구점
에서 발급한 것이라면?
당연히 믿지 않을 것입니다.
Java도 똑같습니다.
Java
↓
상대 서버 인증서 확인
↓
누가 발급했는지 검증
↓
신뢰 가능?
↓
연결 허용 또는 거부
PKIX란 무엇인가?
PKIX는
Public Key Infrastructure X.509
의 약자입니다.
쉽게 말하면
인증서 신뢰 체계
라고 생각하면 됩니다.
우리가 SSL 인증서를 신뢰할 수 있는 이유는
인증기관(CA)
↓
중간 인증기관
↓
서버 인증서
라는 체계가 있기 때문입니다.
인증서 체인이란?
이 개념이 가장 중요합니다.
예를 들어
example.com
의 인증서가 있다고 가정해봅시다.
실제로는 아래처럼 연결되어 있습니다.
Root CA
↓
Intermediate CA
↓
example.com 인증서
이를 인증서 체인(Certificate Chain)이라고 부릅니다.
Java는 무엇을 검증할까?
Java는 서버에 접속하면 다음을 확인합니다.
서버 인증서
↓
중간 인증기관
↓
루트 인증기관
이 경로가 정상적으로 연결되는지 검사합니다.
예시
서버 인증서
↓
DigiCert Intermediate
↓
DigiCert Root
Java가
DigiCert Root
를 신뢰하고 있으면
HTTPS 연결 성공
입니다.
그런데 왜 오류가 발생할까?
대표적인 원인은
인증서 체인을 끝까지 만들 수 없음
입니다.
그래서
PKIX path building failed
가 발생합니다.
가장 흔한 원인 1
인증서가 신뢰 저장소에 없음
Java는 자체 신뢰 목록을 가지고 있습니다.
이를
cacerts
라고 합니다.
만약 서버 인증서가
사설 인증서
이거나
회사 내부 인증서
라면
Java는 처음 보는 인증서라서 거부합니다.
가장 흔한 원인 2
Java 버전이 너무 오래됨
오래된 Java는
새로운 인증기관을 모를 수 있습니다.
예를 들어
Java 7
같은 구버전에서는
최신 인증서를 신뢰하지 못하는 경우가 있습니다.
가장 흔한 원인 3
중간 인증서 누락
서버가
서버 인증서
만 보내고
Intermediate CA
를 보내지 않는 경우입니다.
그러면 Java는
누가 발급했는지 모르겠는데?
라고 판단합니다.
가장 흔한 원인 4
프록시 또는 SSL 장비
회사 내부망에서는
내 PC
↓
보안장비
↓
인터넷
구조인 경우가 많습니다.
보안장비가 SSL을 해독하기 위해
새로운 인증서를 생성하기도 합니다.
하지만 Java는
그 인증서를 신뢰하지 않습니다.
그래서 PKIX 오류가 발생합니다.
실제 업무에서 자주 보는 사례
사례 1
개발 서버에서는 정상
운영 서버에서만 실패
원인
운영 서버의 cacerts가 오래됨
사례 2
브라우저는 정상
Java만 실패
원인
브라우저 신뢰 저장소와
Java 신뢰 저장소가 다름
사례 3
외부 API 연동 실패
원인
상대방 서버 인증서 변경
어떻게 확인할까?
가장 많이 사용하는 명령어
openssl s_client -connect example.com:443
출력 예시
Certificate chain
0 s:/CN=example.com
1 s:/CN=Intermediate CA
2 s:/CN=Root CA
체인이 정상인지 확인할 수 있습니다.
Java에서 신뢰 저장소 확인
keytool -list \
-keystore $JAVA_HOME/lib/security/cacerts
기본 비밀번호
changeit
입니다.
임시 해결 방법
인증서를 추출한 후
keytool -importcert
로 cacerts에 등록할 수 있습니다.
예시
keytool -importcert \
-file server.crt \
-keystore cacerts \
-alias myserver
하지만 주의
실무에서는
인증서 검증 무시
TrustAll
HostnameVerifier 무력화
를 사용하는 경우가 있습니다.
예를 들면
TrustManager[] trustAll
코드입니다.
이 방법은 개발 테스트에서는 사용할 수 있지만
운영에서는 절대 권장되지 않습니다.
왜냐하면
가짜 서버
중간자 공격
위조 인증서
를 구분할 수 없게 되기 때문입니다.
정리
PKIX Path Building Failed는
복잡해 보이지만 사실 한 문장으로 설명할 수 있습니다.
Java가 상대 서버의 인증서를 신뢰하지 못해서 HTTPS 연결을 거부한 상태
대부분의 원인은 다음 네 가지입니다.
1. 신뢰 저장소(cacerts)에 인증서 없음
2. Java 버전이 너무 오래됨
3. 인증서 체인 누락
4. 프록시 또는 SSL 보안장비 개입
SSL/TLS 문제를 분석할 때는 단순히 에러 메시지만 보지 말고
인증서
인증서 체인
Java 버전
cacerts
프록시 환경
을 함께 확인하는 습관이 중요합니다.
PKIX 오류를 이해하는 순간, 대부분의 HTTPS 인증서 문제를 스스로 분석할 수 있게 됩니다.
'개발 > 네트워크' 카테고리의 다른 글
| SSL 인증서란 무엇인가? 개발자와 일반인 모두 이해하는 쉬운 설명 (0) | 2026.06.06 |
|---|---|
| SSL/TLS란 무엇인가? 개발자가 꼭 알아야 할 HTTPS 통신 원리 (0) | 2026.06.04 |
| SSL/TLS란 무엇인가? HTTPS 통신 원리와 개발자가 알아야 할 오류 해결 방법 (0) | 2026.06.01 |
| Nginx란 무엇인가? 톰캣과 차이까지 쉽게 설명드립니다 (0) | 2026.04.24 |
| 그럼 NAT라는 장비가 있는건가요?(개념 정리) (0) | 2026.04.18 |
| WEB, WAS, NAT 관계 한 번에 이해하기 (0) | 2026.04.16 |
| [네트워크 기초] 네트워크 기초 명령어(ping, tracert등) (0) | 2016.04.07 |