[Network] TLS/SSL 인증서 미지원에 따른 예외 처리 정리

stanley.·2024년 11월 20일
0

최근 회사에서 외부사 연동을 진행중에 발생했던 문제가 있었다.
A 서버에서 정상적으로 통신 되었던 외부사 도메인이 B 서버에서는 SSLException이 발생하며 정상적으로 HTTPS 통신이 진행되지 않아 적잖이 당황했었는데, 해당 예외가 발생한 원인에 대해 정리해보도록 하겠다.

발생 에러

사내 에러 로그를 공유할 수는 없기에 동일한 에러와 관련한 StackOverFlow를 가져와봤다.
https://stackoverflow.com/questions/58936384/java-8-update-162-javax-net-ssl-sslexception-received-fatal-alert-unexpected-mes

발생 원인

위 site에서도 참고할 수 있듯이 특정 자바 버전이 지원하는 TLS / SSL의 버전이 다르다.
A 라는 서버의 자바 버전과 B라는 서버의 자바 버전이 다르다면 지원하는 TLS/SSL 버전이 다를 수 있다는 것이다.
HTTPS 통신의 경우 신뢰성을 보장하기 위해 암호화 프로토콜을 기반으로 클라이언트와 서버간의 통신이 진행되는데, 서버가 지원하지 않는 프로토콜로 클라이언트가 서버에 요청을 보낸다면 당연히 정상적으로 통신이 이루어지지 않을 것이다.

특정 도메인이 지원하는 TLS 인증서 버전 확인하기

https://www.ssllabs.com/

위 사이트를 통해 특정 도메인이 지원하는 TLS 버전 정보를 알 수 있다.

외부사로 부터 전달받은 도메인을 확인하니, 사내 서버의 자바 버전 (JDK 1.6)이 지원하는 TLS 1.0 버전을 지원하지 않음을 확인할 수 있었다.

즉, B 서버는 Java 6 으로 구성되어 있어 TLS 버전이 1.0으로 설정되어 있었고 외부사에선 TLS 1.0을 지원하지 않아 HandShake Exception이 발생한 것이다.

해결 방안

서버의 자바 버전을 TLS 버전을 지원하는 버전으로 변경한다.

정리

레거시한 프로젝트를 맡게 되어 외부사 연동을 진행해보니 클라이언트와 서버 간 지원하는 TLS / SSL 인증서가 다르다면 정상적으로 HTTPS 통신이 되지 않는 것을 직접 눈으로 확인할 수 있는 유익한 작업이었다.
다음 게시글들을 통해 SSL, TLS, Cipher suite에 대해 정리하고 이를 기반으로 HTTPS 통신이 어떻게 이루어지는지 정리해보겠다.

profile
🖥 Junior Developer.

0개의 댓글