Java 의 SSLHandshakeException 문제 해결

YOOYEON.DEV·2023년 1월 9일

문제

외부 API를 호출하는 코드를 작성하다가 SSLHandshakeException 문제를 만나게 되었다.

API를 제공하는 곳에 물어봤지만 자바로 해당 API를 쓰는 업체는 없었고, 대부분 노드로 사용하여 이와 같은 사례가 없다고 했다.

이는 서버/클라이언트간 사용하려는 SSL/TLS 버전이 맞지 않아 발생한다고 한다.

나의 경우 실무에서 서버 대 서버 통신을 하다가 발생했다.


해결

1. 증명서 발급

처음에는 증명서를 발급받아 conf 파일에 넣어 해결했다. 그런데 회사에서 파일 관리와 기타의 이유로 이 방법을 지양했다.

2. TrustManager 활용

두번째 방법으로 TrustManager를 활용했다. 이 방법으로 호출을 잘 하고 있었다. 그런데 코드 변경도 없는데 갑자기 오픈 며칠 전 다시 SSLHandshakeException 오류가 발생했다. 이상한 것은 운영에서는 잘 호출되고 검증에서는 호출되지 않는다는 것이었다.
다음처럼 버전을 변경해주어도 해결되지 않았다.

System.setProperty("https.protocols", "TLSv1.2");

3. 자바 버전 변경

마지막 방법으로 자바 버전 변경이다.
이때가 돼서야 ssl 버전을 확인했다. 도메인만 알 수 있으면 서버에서 ssl 버전을 알 수 있었다.
openssl 명령어로 버전을 확인했더니 모두 TLS1.2 버전으로 문제가 없어보였다.
그러다가 자바 버전까지 확인하게 됐다.
TLS1.2 를 사용하려면 적어도 자바 버전이 JDK 1.8.0_202 이렇게 되어야한다. 운영과 검증 모두 1.8 버전이었지만 자세히 보니 서브 버전이 달랐던 것이다. 검증에서는 1.8.0_1xxx의 버전을 사용하고 있었다.
jdk를 JDK 1.8.0_202 이상의 버전으로 변경했더니 잘 작동했다. 명령어로 TLS1.2 버전인 것을 확인했지만 자바 최소 버전이 충족되지 않으면 TLS1.2 버전을 사용할 수 없나보다.


해결 방법은 간단했지만 운영 배포가 얼마 남지 않은 시점 원인을 찾기까지 꽤 오래걸리고 답답한 시간이었다.

http와 https에 대해서도 다시 공부하는 계기가 되었고, openssl 명령어로 어떤 SSL Protocol을 사용하는지 찾을 수 있다는 것을 배웠다.


[참고]

https://sagittariusof85s.tistory.com/158
https://chinggin.tistory.com/566
https://ls-altr.tistory.com/70

profile
백엔드 개발자 입니다

0개의 댓글