前言
最近在项目中使用Hutools 请求HTTPS接口出现SSLHandshakeException: Received fatal alert: handshake_failure异常,经过排查属于JDK版本中安全机制导致,不同https安全协议不一致,可能是TLSv1.2,TLSv1.1,TLSv1.3等,TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差
查询证书安全协议方式: openssl s_client -connect 你的域名:443
分析和解决
ssl握手过程中使用了jdk8默认的ssl协议TLSv1.2,并且jdk8默认的Cipher Suites禁用了RC4算法。最终导致握手失败。
查阅资料,确定是由于JDK版本问题,测试项目中使用jdk8-121版本使用hutools中的HttpUtil.post会出现这种异常,最终升级了JDK8-401解决问题。
总结
其他解决思路,但是未尝试,有兴趣可以尝试
1、在请求HTTP的时候尝试创建SSLConnectionSocketFactory的时候添加安全协议;
2、对方的Nginx配置Https的时候是否可以尝试放开某些协议通过。
如: #ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
#表示优先使用服务端加密套件。默认开启
ssl_prefer_server_ciphers on;