本地ca证书库过期导致curl验证失败,需更新ca-certificates包并执行update-ca-certificates --fresh;若为debian 9等旧系统,还需手动添加isrg root x2证书并注释/etc/ca-certificates.conf中已失效的dst_root_ca_x3.crt行。

当Linux系统中执行curl命令访问HTTPS网站时突然报错“SSL certificate problem: certificate has expired”,说明本地curl在验证服务器证书时,发现其信任链中某个关键证书(通常是根证书或中间证书)已被系统判定为过期,而非目标网站自身证书过期——这在Debian 9、Ubuntu 16.04等旧系统上尤为常见,因内置CA证书库未更新至支持ISRG Root X2等新信任锚。
确认是否为本地证书库过期导致
运行 openssl s_client -connect curl.se:443 -showcerts 2>/dev/null | openssl x509 -noout -dates,查看输出中的“notAfter”时间。若显示早于【2026年9月29日】,则证实本地信任的根证书已物理过期,必须更新系统CA库。
对比测试:curl -I https://google.com 与 curl -I https://letsencrypt.org。前者通而后者的失败,是典型Let’s Encrypt证书链信任断裂信号。
更新系统CA证书库(推荐方案)
第一步:更新包管理器索引并升级ca-certificates包
Debian/Ubuntu系执行:sudo apt update && sudo apt install --reinstall ca-certificates
CentOS/RHEL系执行:sudo yum update ca-certificates 或 sudo dnf update ca-certificates
第二步:强制刷新证书软链接与哈希索引
执行 sudo update-ca-certificates --fresh。该命令会清空/etc/ssl/certs下的符号链接,重新扫描/usr/share/ca-certificates/下所有.crt文件并生成新哈希目录。不执行此步,旧证书仍可能被缓存调用。
第三步:验证生效
curl -v https://curl.se 2>&1 | grep "subject:",确认返回的证书主题含"ISRG Root X2"或"DST Root CA X3"(后者已于2021年9月30日停用,但部分旧系统仍残留,需手动剔除)。
临时绕过验证(仅限调试)
方法一:使用 -k 参数忽略全部SSL校验
curl -k https://example.com
方法二:指定最新CA证书文件路径
下载权威CA Bundle:curl -s https://curl.se/ca/cacert.pem -o ~/cacert.pem
然后调用:curl --cacert ~/cacert.pem https://example.com
【注意:-k参数会使连接完全失去身份认证能力,生产环境严禁使用】
修复Debian 9等老旧系统特有问题
Debian 9默认不包含ISRG Root X2,且其ca-certificates包版本过旧,update-ca-certificates无法自动拉取新根。必须手动注入:
执行 wget -O /usr/local/share/ca-certificates/isrgrootx2.crt https://letsencrypt.org/certs/isrg-root-x2.pem
再运行 sudo update-ca-certificates
若仍报错,检查/etc/ca-certificates.conf中是否含DST_Root_CA_X3.crt行——该证书已于2021年失效,需用#号注释掉该行,否则update-ca-certificates会将其重新激活。











