외부 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에 해당 기관의 인증서가 없을 수 있음.
일단 임시로는,,
4. SSL 이 아닌 http 로 API 호출하거나, Java8 로 버전업그레이드
=> 근본적으로 JDK의 버전을 올려서 TLS 기본버전을 변경함.
=> http 로도 API 호출 동작이 가능해서 http로 호출함.
'프로그래밍' 카테고리의 다른 글
SSL 인증서 총 정리 (* 한국전자인증 2세대, WILD , Error ) (0) | 2023.12.22 |
---|---|
[업무기록] 20230623 관련 잡다 (Tomcat, MariaDB) (0) | 2023.06.23 |
[Spring] Spring Boot로 블로그 만들어보기(타임리프) - (1) (0) | 2023.06.13 |
[Spring MVC] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(2) (0) | 2023.05.23 |
[Spring] 국세청_사업자등록정보 진위확인 및 상태조회 서비스 (WebClient) (0) | 2023.05.22 |