SSL 관련 Exception 해결하기
SSL(Secure Socket Layer)이 적용된 https 프로토콜 사이트에 대해 connection 구성시 발생하는 Exception의 해결방법에 대해 알아보겠습니다.
1. SSLHandshakeException
Java에서 https 프로토콜로 remote 사이트에 연결시 다음과 같은 Exception이 발생하는 경우가 있습니다.
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
위의 에러는 server와 client 간에 사용하는 SSL/TLS 버전이 맞지 않기 때문에 발생합니다.
server가 TLS 1.2 버전만 사용할 때 Java의 경우 JDK 1.8 부터 TLS 1.2 가 기본 버전이므로 문제가 없지만, 이전 JDK 버전을 사용하는 client의 경우는 예외가 발생하게 됩니다.
JDK 1.8 버전으로 업그레이드하면 문제가 해결되지만 그렇게 하기 어려운 경우 다음 방법으로 해결하면 됩니다.
먼저 System.setProperty() 메서드를 사용하여 https.protocols 속성을 지정해주는 방법입니다.
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
또 다른 방법은 다음과 같이 JVM 옵션을 사용하는 방법입니다.
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
2. SSLProtocolException
SSLHandshakeException을 해결해도 이후에 다음과 같은 Exception이 발생하는 경우가 있습니다.
javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name
JDK 1.7의 경우 SNI(Server Name Indication) Support의 기본 옵션이 enable로 지정되어 있어서 발생하는 문제이거나,
좀 더 찾아보면 Apache 설정 중 Server Alias 설정으로 인해 발생는 문제이기도 합니다.
앞서 알아본 SSLHandshakeException과 같은 방법으로 해결이 가능합니다.
먼저 System.setProperty() 메서드를 사용하여 jsse.enableSNIExtension 속성을 false로 설정해주는 방법입니다.
System.setProperty("jsse.enableSNIExtension", "false");
마찬가지로 또 다른 방법은 다음과 같이 JVM 옵션을 사용하는 방법입니다.
-Djsse.enableSNIExtension=false
이상으로 Java의 SSL 관련 Exception을 해결하는 방법에 대해 알아보았습니다.
※ 참고 문헌
lesstif.com, SSLHandshakeException 문제 해결, https://www.lesstif.com/pages/viewpage.action?pageId=29590407
- github.io, SSLProtocolException, http://kdsr2z0.github.io/SSLProtocolException/
- tistory, SSLProtocolException, http://tomining.tistory.com/94
- tistory, SSLProtocolException, http://fruitdev.tistory.com/24