本文共 938 字,大约阅读时间需要 3 分钟。
一.SSL/TLS的Handshake过程
在SSL/TLS的Handshake过程中,客户端与服务器之间需要交换参数,具体过程如下:
二.handshake_failure异常分析
在客户端与服务器之间进行SSL/TLS通信的过程中,常常发生如下异常:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
首先,该异常发生的时机,是在客户端与服务器之间进行的Handshake的过程中,客户端与服务器之间的有效数据传输还没有开始。
原因一:针对上述Handshake的过程,该异常往往发生在第4步,即客户端得到服务器的数字证书时,向CA验证证书有效性时。
客户端在试图向可信CA进行验证时,发现服务器的数字证书所引用的CA,没有出现在客户端的trust store中。
原因二:此外,该异常也可能是由于客户端与服务器所使用的SSL/TLS版本不一致。服务器使用的TLS版本高,而客户端支持的TLS版本低。
Java对SSL/TLS的默认支持如下:
Java版本 | 默认SSL/TLS版本 |
Java8 | TLSv1.2 |
Java7 | TLSv1 |
Java6 | TLSv1 |
如果服务器使用TLSv1.2,而客户端Java7(默认使用TLSV1),则会抛出该异常。
这时,可以为客户端设置JVM参数如下,以提高客户端的TLS版本:
-Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1.0,SSLv3,SSLv2Hello
上述两种原因,都可以通过升级JDK到1.8解决,因为Java 8默认支持TLSv1.2版本。
转载地址:http://qtlai.baihongyu.com/