SSL 인증 이슈 SSLHandshakeException: PKIX path building failed 이해하기

yeahdy_:)·2024년 5월 6일

error

목록 보기
4/5
post-thumbnail

이슈

Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128)

운영 중인 서비스에서 외부 API 호출 시 갑자기 위와 같은 에러가 발생했다.

기존에 외부 API 통신 시 발생한 적이 없는 에러였고, 동일한 요청을 포스트맨으로 호출 해보니 성공적으로 응답되었다.

원인

원인을 찾아보니 외부 서버가 클라이언트에게 제공하는 SSL 인증서를 클라이언트가 신뢰할 수 없을 때 발생한다고 한다.

(여기서 “클라이언트”는 내가 관리하는 내부서버를 의미한다.)

외부API 통신 시 외부 서버는 SSL 통신을 시작할 때 자신의 인증서를 클라이언트에게 제공하는데, 이때 클라이언트에 해당 인증서가 신뢰된 형태로 저장되어 있어야 한다. (SSL 통신 시 클라이언트는 서버로부터 받은 인증서의 서명을 통해 유효성 검증)

그런데 내부 서버에 유효한 루트 인증서가 없으면 위와 같은 오류가 발생한 것이다. 따라서 외부서버의 SSL인증서를 발급(또는 갱신) 해 주면 인증서를 찾아서 검증이 가능하다.

서비스를 운영한지 거의 2년이 다 되어가기 때문에 인증서 유효기간이 만료되었을 가능성이 있었다.

그런데 해결에 앞서 SSL 인증서는 뭐고, 왜 SSL 통신을 하는걸까..

그리고 인증서는 어디에 저장되어 있어서 이걸 찾아서 검증하는 것일까? 원인을 이해하기 위해 사전 지식이 필요했다.


SSL 인증서 이해하기

SSL 인증서란

SSL은 클라이언트와 서버 간의 통신을 암호화하여 중간에서 데이터를 가로채더라도, 그 내용을 이해할 수 없게 만드는 기술이다. 따라서 보안의 필요성이 있는 사용자의 개인 정보, 비밀번호 등과 같은 민감한 정보를 안전하게 전송할 때 사용된다.

SSL 통신을 하는 이유

SSL은 서버의 인증서를 통해 서버의 신원을 검증함으로써, 사용자가 의도한 서버와 통신하고 있는지 확인할 수 있게 해준다. 따라서 피싱 사이트와 같은 공격으로부터 보호하고, 데이터 보안을 위해 SSL 통신을 사용하는 것!

SSL 인증서는 어디에 저장?

결론은 인증서가 저장되는것이 아니라 외부 서버의 인증서를 제공받으면 클라이언트는 임시적으로 해당 인증서를 사용 해 JVM 내부의 keystore 저장소에서 이를 검증한다.

JVM은 자체적으로 keystore라는 신뢰할 수 있는 인증서 저장소를 가지고 있는데, 이 keystore에는 전 세계의 주요 인증 기관들이 발급한 루트 인증서들이 미리 등록되어 있다.

SSL 통신을 할 때, JVM은 외부 서버로부터 받은 인증서가 keystore에 등록된 루트 인증서로부터 유효하게 서명되었는지를 확인한다. 이 과정에서 유효한 루트 인증서가 keystore에 없다면, 위에서 언급한 PKIX path building failed 오류가 발생하는 것.

그럼 모든 외부API 통신 시 SSL 검증을 하는 것일까?

SSL(Secure Sockets Layer)은 선택적인 보안 프로토콜이기 때문에 모든 외부통신 시 SSL을 사용하는 것은 아니다. 따라서 서버에서 SSL 설정을 통해 SSL 통신이 가능하다.


이해 참고 만화
브라우저와 서버 간의 handshake
https 는 왜 필요할까?


해결

외부 API 서버의 인증서가 JVM의 keystore에 미리 등록된 신뢰하는 인증 기관들이 발급한 유효한 인증서가 아니기 때문에 해당 인증서를 JVM의 keystore에 수동으로 추가해줘야 한다. 그럼 JVM은 해당 인증서를 신뢰하게 되어, SSL 통신이 정상적으로 이루어 지게 된다.

해결은 아래 사이트의 가이드대로 진행하니 해결이 되었따!🤩

해결 참고 사이트
https://www.lesstif.com/java/java-pkix-path-building-failed-98926844.html
(사이트가 지금은 접속이 안되네요 ㅜㅜ..)

profile
기억하기 위해 기록하고 있습니다. 포스트 중 잘못된 정보가 있다면 코멘트 남겨주세요🐰

0개의 댓글