HTTPS 握手失败问题排查记录

发布时间 2023-10-25 11:56:08作者: 仓隽

问题

IP Camera需要通过HTTPS访问对端平台,使用一直正常使用封装好的SSL模块访问对端服务器时, IPC发送了Client Hello,

但是对端直接回复Alert Handshake Failure

 


排查步骤

测试IPC HTTPS连接其他服务器,通信正常; 使用浏览器访问该服务器,也能正常访问。

 

上网搜索 https alert handshake failure

以下是一些可能导致 "https alert handshake failure" 错误的常见原因:

SSL/TLS版本不匹配:在TLS握手期间,客户端和服务器必须就使用的TLS版本达成一致。如果版本不匹配,会导致握手失败。

对比正常通信的和握手失败的抓包内容,TLS版本是一致的

证书问题:如果服务器的SSL/TLS证书无效、过期或不受信任,握手也会失败。

没走到这步,直接就回复失败了

密码套件不匹配:客户端和服务器必须选择相同的加密套件来进行通信。如果它们之间没有匹配的套件,握手会失败。

对比正常通信的和握手失败的加密套件(cipher suite) 也是匹配的

中间人攻击:这是一种安全问题,其中第三方试图拦截HTTPS通信,可能导致握手失败。

暂不考虑,毕竟一个能通

不支持的协议特性:某些服务器可能要求特定的协议特性,如果客户端不支持,也会导致握手失败。

大概率是这个问题了

 

通过持续的搜索和对比抓包内容,中间也被误导不少

HTTPS 温故知新(六) —— TLS 中的 Extensions

 

这条导致我一直没怀疑扩展字段,但其他内容还是不错的。

直到搜到了似乎和我一模一样的问题,对比抓包结果差异的过程中也怀疑过部分扩展字段,下面这文章加深了我的怀疑

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

img

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

img

https 握手失败问题排查全记录

解决

简单了解下SNI, 在SSL_connect()之前用SSL_set_tlsext_host_name(ssl, HOSTNAME)设置一下SNI就解决了这个问题。

 

https://www.openssl.org/docs/manmaster/man7/ossl-guide-tls-client-block.html

https://blog.csdn.net/u011130578/article/details/77979325

 

其他HTTPS参考链接:

https://blog.csdn.net/qq_42370809/article/details/126352996

https://www.jianshu.com/p/c93612b3abac