CentOS6访问Let's Encrypt站点wget证书校验失败curl正常问题问询
差异原因分析
- 依赖的TLS底层库不同
你使用的CentOS 6.10环境中,curl和wget分别编译绑定了不同的TLS实现:
从curl的运行日志可见其使用NSS 3.44作为TLS底层库,而CentOS 6官方源提供的wget默认编译绑定的是OpenSSL 1.0.1e版本。 - 证书链校验逻辑的差异是核心诱因
Let's Encrypt在DST Root CA X3根证书过期后,为了兼容旧安卓设备,默认提供的证书链包含两条信任路径:
- 站点证书 → R3中间证 → ISRG Root X1(有效根证书,已包含在主流CA信任库中)
- 站点证书 → R3中间证 → ISRG Root X1 → 交叉签名的DST Root CA X3(已过期)
两个TLS库的校验逻辑不同:
OpenSSL 1.0.1e的校验逻辑为:只要证书链中存在任意一个已过期的根证书,直接判定整个证书校验失败,不会尝试查找其他有效信任路径。即使你的CA bundle中已经包含了有效的ISRG Root X1根证书,wget调用OpenSSL校验时仍会识别到链中过期的DST Root CA X3,返回证书过期错误。
NSS 3.44的校验逻辑为:只要能找到任意一条到信任根的有效路径,就判定校验通过。它会识别到CA bundle中有效的ISRG Root X1根证书,忽略链中附带的过期DST Root CA X3分支,因此curl的证书校验可以正常通过。
- 手动指定CA文件不生效的原因
你为wget强制指定CA文件仍报错,是因为问题并非CA文件中缺失ISRG Root X1根证书,而是OpenSSL 1.0.1e本身的校验逻辑缺陷,和CA证书列表的内容无关。
临时解决方案
如果需要让wget也能正常校验Let's Encrypt证书,可以用以下两种方式:
- 手动从系统CA bundle中删除已过期的DST Root CA X3证书,之后OpenSSL就不会识别到过期根,会走ISRG Root X1的有效路径完成校验
- 运行wget时添加
--no-check-certificate参数跳过证书校验(仅建议用于测试场景)
内容的提问来源于stack exchange,提问作者laurent
相关产品推荐
相关产品推荐

