SSL/TLS의 Handshake 프로세스와 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 이상
1247 단어 IT 관련
SSL/TLS의 Handshake 프로세스에서 클라이언트와 서버 간에 매개 변수를 교환해야 합니다. 구체적인 프로세스는 다음과 같습니다.
클라이언트가 지원하는 다양한 cipher suites (암호화 알고리즘과 Hash 함수 포함) 서버는 그 중에서 자신도 지원하는 cipher suite를 선택하고 클라이언트에게 이를 통해 데이터 전송을 할 것이라고 통지한다서버는 동시에 자신의 디지털 인증서(서버 이름, CA 및 공개 키 포함)를 클라이언트에게 식별자로 보냅니다클라이언트가 CA에 서버의 디지털 인증서 유효성 확인클라이언트가 세션 키를 생성합니다(클라이언트와 서버 간의 후속 데이터 전송은 이 세션 키를 사용합니다)서버의 공개 키 암호화 세션 키를 사용하여 서버에 전송또는 클라이언트가 DH 키 교환을 사용할 수도 있습니다.
2.handshake_failure 이상 분석
클라이언트와 서버 간에 SSL/TLS 통신을 수행하는 동안 다음과 같은 예외가 자주 발생합니다.
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
우선, 이 이상이 발생하는 시기는 클라이언트와 서버 간에 진행되는Handshake 과정에서 클라이언트와 서버 간의 유효한 데이터 전송이 시작되지 않았다.
원인 1: 상술한 Handshake 프로세스에 대해 이 이상은 클라이언트가 서버의 디지털 인증서를 받을 때, CA에 인증서의 유효성을 검증할 때 흔히 발생한다.
클라이언트가 신뢰할 수 있는 CA를 검증하려고 할 때 서버의 디지털 인증서가 인용하는 CA가 클라이언트의truststore에 나타나지 않은 것을 발견했습니다.
원인 2: 클라이언트와 서버가 사용하는 SSL/TLS 버전이 일치하지 않기 때문일 수도 있습니다.서버에서 사용하는 TLS 버전은 높지만 클라이언트가 지원하는 TLS 버전은 낮습니다.
이 경우 클라이언트의 TLS 버전을 향상시키기 위해 다음과 같은 JVM 매개 변수를 설정할 수 있습니다.
-Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1.0,SSLv3,SSLv2Hello
두 가지 이유 모두 JDK를 1.8로 업그레이드하여 해결할 수 있습니다.Java 8은 기본적으로 TLSv1.2 버전을 지원합니다.