[오류] javax.net.ssl.SSLHandshakeException : Received fatal alert : handshake_failure

외부 API (SSL) 과의 통신에서 SSLHandshakeException 발생

사유 : 서버-클라이언트 사이의 TLS 버전이 상이할 때의 에러

 

* TLS는 인터넷 커뮤니케이션을 위한 개인 정보와 데이터 무결성을 제공하는 보안 프로토콜

 

* TLS 기본버전이 Java 8에서 변했다.

  Java 8 이전 버전에서는 TLSv1이 기본적으로 사용되며, Java 8 이후 버전에서는 TLSv1.2가 기본으로 사용됩니다. Java 11부터는 TLSv1.3도 지원

 

1. 이클립스 Tomcat 설정 변경

Run > Run Configuration > Arguments 탭

 

VM arguments 에 아래 2줄 추가

-Djavax.net.debug=all (TLS 통신 관련 디버깅)

-Dhttps.protocols=TLSv1.2 

 

실행, 디버깅은 잘되는데 동일함.

 

http-bio-6300-exec-5, READ: TLSv1.2 Alert, length = 2
http-bio-6300-exec-5, RECV TLSv1 ALERT:  fatal, handshake_failure

 

 

2. setProperty

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

구글 검색 시 , 위의 2가지방법이 JDK 1.7에서 해결법이라 많이 나오나 안된다... 

근본적으로 ClientHello 에서 보면 TLSv1 로 계속 호출하고 있는데 변경을 어찌 해야 할 지 모르겠다.

(HttpClient client와 HttpPost를 통해서 API 호출하고 있음, HttpResponse response = client.execute(post) 시에 에러 발생)

 

해보지 못한 건

3. java keyStore에 해당 기관의 인증서가 없을 수 있음.

https://jckim-dev.tistory.com/entry/java-%C2%A0javaxnetsslSSLHandshakeException-Received-fatal-alert-handshakefailure

 

일단 임시로는,,

4. SSL 이 아닌 http 로 API 호출하거나, Java8 로 버전업그레이드

 => 근본적으로 JDK의 버전을 올려서 TLS 기본버전을 변경함.

 => http 로도 API 호출 동작이 가능해서 http로 호출함.