Java 의 SSLHandshakeException 문제 해결

YOOYEON.DEV·2023년 1월 9일
1

문제

외부 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개의 댓글