2021年9月使用Let's Encrypt出现SSL handshake failed错误问题
故障根因说明
该故障的直接触发原因是2021年9月30日Let's Encrypt旧根证书DST Root CA X3正式过期,结合Qt SSL校验的特有逻辑导致握手失败,具体逻辑如下:
- Let's Encrypt当时为了最大程度兼容老旧设备,默认给服务端颁发的证书采用交叉签名方案:新证书既可以被新的可信根证书ISRG Root X1验证,也附带了已过期DST Root CA X3的交叉签名,服务端返回的SSL握手包的证书链末尾会携带该旧根证书
- Qt的SSL校验逻辑存在特殊优先级规则:即使设备系统根证书库中已经存在有效的ISRG Root X1,Qt仍会优先校验证书链末尾的根证书,检测到DST Root CA X3已过期后直接判定证书无效,抛出
SSL handshake failed错误
该故障完全匹配「客户端、服务端均无变更情况下突发报错」的场景:故障发生时间与旧根证书过期时间完全重合,且仅影响Qt开发的客户端,其他非Qt技术栈的客户端访问同一后端服务不会触发该错误。
常见修复方案
- 客户端侧:将Qt版本升级至5.15.2、6.2.0及以上版本,上述版本已修复根证书校验优先级的缺陷;若无法升级Qt版本,可在代码中手动将ISRG Root X1加入可信证书列表,或配置SSL校验规则忽略已过期的DST Root CA X3证书
- 服务端侧:调整证书配置,停止在证书链中附带已过期的DST Root CA X3,仅返回由ISRG Root X1签名的证书链即可解决问题
内容的提问来源于stack exchange,提问作者S.M.Mousavi
相关产品推荐
相关产品推荐

