前言
今天无缘无故的一个"老"服务,突然有了异常,查看日志是guzzle包请求https链接时报证书已过期。
SSL certificate problem: certificate has expired
通过浏览器查看域名证书在有效期内,没有任何问题。
问题确认
可以通过下面的指令,看一下请求是否正常。
curl https://www.google.com #正常(不能访问谷歌就用百度试试)
curl https://letsencrypt.org #不正常
https://www.google.com 使用的是由“Google Trust Services LLC”颁发的 TLS 证书,测试期间,根据该证书的有效时间表明,该证书未过期,且访问正常。
谷歌访问不了就用百度 curl https://www.baidu.com
https://letsencrypt.org 使用的是由“Let’s Encrypt”颁发的 TLS 证书,测试期间,根据该证书的有效时间表明,该证书未过期,但访问不正常
问题指向let’s encrypt签名的证书
问题解决
在serverfault论坛,找到了此问题的讨论,并且网友在回答中,给出了问题发生的原因,与相对完美的解决方案。
https://serverfault.com/questions/1079199/client-on-debian-9-erroneously-reports-expired-certificate-for-letsencrypt-issue
Let’s Encrypt 颁发过两个根证书,分别是“DST Root CA X3”和“ISRG Root X1”,根证书“DST Root CA X3”的有效期限是 2021/09/29,已过期,“ISRG Root X1”的有效期限是 2024/09,截至本文成稿日(2021/10/05),还未过期。
许多过旧的操作系统内,只内置了根证书“DST Root CA X3”,较新版本的操作系统内,同时内置旧根证书“DST Root CA X3”与新根证书“ISRG Root X1”,保留旧根证书是为了保持与旧操作系统的兼容性,内置新根证书是为了适应采用新的加密方式的现代 HTTPS 网站。目前对于搭载 Android 4.0 及以上操作系统版本、OpenSSL 版本 ≥ 1.1.X 的设备,访问新 HTTPS 网站或与旧设备之间通信,“如果旧的不行,就用新的验证”这个自动切换策略是没问题的。
在证书配置文件中,删除“DST_Root_CA_X3”证书,并重载根证书配置:
sed -i '/^mozilla\/DST_Root_CA_X3/s/^/!/' /etc/ca-certificates.conf && update-ca-certificates -f
完成后再试试请求letsencrypt.org,恢复正常
这个问题一般只出现在低版本操作系统中,我这边是一台稍旧的机器。