后端API使用Httpclient访问一个https服务端接口时出现HandshakeFailure,也就是握手失败
postman调用没问题
python requests verify=False 调用也没问题
以下是握手失败可能的原因:
详情参考:https://developpaper.com/how-to-fix-the-ssl-tls-handshake-failed-error/
本次问题的原因是
客户端服务器向服务端sayhello时,会发送客户端服务器配置的密码套件列表(cipher suites),服务端接收到之后根据自身支持的密码套件选择其中一种,此时,如果客户端发来的密码套件列表没有服务端支持的,服务端就会响应握手失败错误
解决办法
1、找到服务端支持的密码套件
a.使用postman成功调用服务端接口后,在console里可以找到对应的服务端密码套件
b.可以使用网络监控工具(wireshark)对请求进行监控并查找服务端支持的密码套件
2、在客户端服务器中进行配置
a.打开组策略,找到compute configuration -> Administrative Template -> Network -> SSL Configuration Settings -> SSL Cipher Suite Order ,打开,在里面追加新的密码套件
b.重启服务器
https 原理扩展
上图描述了整个TLS协议握手的过程
1、密码套件作用
密码套件本质就是一种对称加密算法(如:AES)用于解密服务端响应报文,加密客户端请求报文,以及解密客户端请求报文,加密服务端响应报文
2、会话秘钥生成及作用
生成方式:由客户端和服务器握手时生成的几个随机数以及预主秘钥通过固定算法生成的秘钥
作用:用作协商好的密码套件的key