通讯模组-SSL-HTTPS连接报错

SNI问题-简称域名认证问题

关于 SNI 就不做太多介绍了,大家可以自己搜一下。简单来说,就是一台服务器配置了多个服务,即有多个域名,当然相应的配置了多个证书,他们监听了相同的端口,这样客户端发送 Client Hello 后,服务端不知道该用哪个证书进行回应,因此服务端就选择困难症犯了,干脆撂挑子不玩了。而 SNI 就是解决这个问题的,SNI 是 TLS 的一个扩展,客户端发送 Client Hello 包时会携带一个域名,这样服务端接收到请求后就可以根据这个域名去找相应的证书了。

案例:问题描述:
客户反馈http下载图片时 ,有的服务器能下载成功,有的服务器下载不成功,不成功时返回的http连接失败,握手失败handshake fail。715 Handshake failed

抓log,导出IP报文,wireshark查看如下:

前三条是 tcp 三次握手,说明网络是通了,然后客户端发起了 Client Hello 包,这是 https 握手的第一步,下一行是服务端正常的 ack 响应。奇怪的是最后一行,服务端发送了 RST 包,终止连接,这也就是请求报 handshake failed 的原因了。
原因参考网址:https://mp.weixin.qq.com/s/Dmv0TA2PFCxbM95m_yS87A
客户问题是SNI未配置有关,配置后解决。设置下使能域名认证就可以了。
open版本设置如下:
将参数enable_SNI设置为1;
标准版设置如下:

总结:https handshake failed一般原因如下:
1.证书问题
2.加密算法问题
3.SNI问题

首先,证书问题,应该不太可能,因为有的 https 地址可以调通,有的不可以。排除掉该原因,当然也可能是误判。
第二条,服务端不支持客户端的加密算法,感觉很像这个原因,因为存在如下情况:请求失败的 url 指向的服务器不支持客户端的加密算法,请求成功的 url 指向的服务器支持客户端的加密算法
怎么排查呢?先看一下客户端发送 Client Hello 所支持的算法:


再通过正确的http报文查看调用该接口成功时使用了什么算法。

不愧是调用成功了,这数据包看着都舒服。https 加密算法是服务端来确定的,在 Server Hello 包中发送给了客户端,那就看看这个包的内容。

这个加密算法客户端发送的 Client Hello 包是包含的,说明2也排除。

那只能看看第三原因了,也就是 SNI。

SNI机制,简单来说,就是一台服务器配置了多个服务,即有多个域名,当然相应的配置了多个证书,他们监听了相同的端口,这样客户端发送 Client Hello 后,服务端不知道该用哪个证书进行回应,因此服务端就选择困难症犯了,干脆撂挑子不玩了。而 SNI 就是解决这个问题的,SNI 是 TLS 的一个扩展,客户端发送 Client Hello 包时会携带一个域名,这样服务端接收到请求后就可以根据这个域名去找相应的证书了。

看是不是这个原因,先看看成功的请求有没有带这个东西。打开 Client Hello 包的详情,还真找到了。

图中打码的地方就是域名了。再看看请求失败的包,有没有该扩展:

没有!!!赶紧试一试是不是这个原因。加上SNI参数,验证成功。

文献参考:https://mp.weixin.qq.com/s/Dmv0TA2PFCxbM95m_yS87A

posted @   anhuizjh  阅读(45)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示