Received fatal alert: handshake_failure错误处理

864 阅读2分钟

最近做整体系统迁移,与其他系统联调时,本来在原有环境正常的接口,迁移到新环境后,居然报错。报错信息如下:

nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

从网上查了好多解决方式,均无效。无奈最后只得自己分析原因。

首先开启在idea中添加如下参数-Dssl.debug=true -Djavax.net.debug=all,开启ssl debug模式。

image.png 然后启动项目,调用接口分析日志

http-nio-8100-exec-1, WRITE: TLSv1.2 Handshake, length = 206
[write] MD5 and SHA1 hashes:  len = 179
0000: 01 03 03 00 8A 00 00 00   20 00 C0 24 00 C0 28 00  ........ ..$..(.
0010: 00 3D 00 C0 26 00 C0 2A   00 00 6B 00 00 6A 00 C0  .=..&..*..k..j..
...
00B0: 31 E0 76                                           1.v
http-nio-8100-exec-1, WRITE: SSLv2 client hello message, length = 179
[Raw write]: length = 181
0000: 80 B3 01 03 03 00 8A 00   00 00 20 00 C0 24 00 C0  .......... ..$..
0010: 28 00 00 3D 00 C0 26 00   C0 2A 00 00 6B 00 00 6A  (..=..&..*..k..j
...
00B0: 8C 60 31 E0 76                                     .`1.v
[Raw read]: length = 5
0000: 15 03 03 00 02                                     .....
[Raw read]: length = 2
0000: 02 28                                              .(
http-nio-8100-exec-1, READ: TLSv1.2 Alert, length = 2
http-nio-8100-exec-1, RECV TLSv1.2 ALERT:  fatal, handshake_failure
%% Invalidated:  [Session-1, SSL_NULL_WITH_NULL_NULL]
http-nio-8100-exec-1, called closeSocket()
http-nio-8100-exec-1, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

中间省略了一部分无用信息

观察第1行信息,显示客户端使用TLSv1.2协议进行握手

观察第7行信息,显示客户端使用SSLv2协议发送client hello消息

观察第17行信息,显示服务端使用TLSv1.2协议读取

观察第18行信息,显示使用TLSv1.2协议接收消息

通过观察发现客户端发送消息使用的是SSLv2协议,但是服务端接收消息却使用TLSv1.2协议,初步断定代码有问题,于是抓紧排查相关代码,发现之前同事写的这块代码是产生问题的根本原因

image.png 由于SSLv2与SSLv3协议存在许多漏洞,目前已废弃。以此推断应该是服务器不再支持SSLv2与SSLv3协议,所以果断将这两条协议从代码中去除。

重启服务后再次调用三方系统接口已可以正常访问