今天突然所有的 HTTPS 请求,我的 Ubuntu 14 服务器使用 Let's Encrypt 颁发的 SSL 证书发送到网站,开始失败。cURL 产生的错误是:
curl: (60) SSL certificate problem: certificate has expired
当我使用此命令检查网站证书时:
echo -n | openssl s_client -showcerts -connect website.com:443 -servername website.com
我看到所有证书链都是最新的。
那么为什么我会收到过期错误?如何解决?
原因是“DST Root CA X3”证书昨天已经过期。
要修复它,只需禁用服务器上的证书。跑:
在提示“信任来自证书颁发机构的新证书?”的第一个屏幕上 选择“是”。在下一个屏幕上,按键盘上的向下箭头键,直到找到
mozilla/DST_Root_CA_X3.crt
,按空格键取消选择它([*]
应该变成[ ]
),然后按 Enter。编辑文件 /etc/ca-certificates.conf
!
用这样的行查找和评论!mozilla/DST_Root_CA_X3.crt
保存文件并使用命令更新证书
sudo update-ca-certificates
在 CentOS 之类(基于 RPM)系统上仅供参考,请使用:
yum reinstall ca-certificates
Android 做出了一个设计决定,忽略了根证书的到期(可以说,根证书的到期一开始就没有多大意义)。
“让加密”是一个相对较新的 CA,为了支持现有系统,它们的根由 DST “交叉签名”*。DST 根证书现已过期,但由于前面提到的 android 行为,交叉签名对于支持运行旧版本 andriod 的客户端仍然有用。
当在具有现代根证书列表的系统上使用这样的链时,应忽略交叉签名并应使用 IRSG(让加密)根。不幸的是,openssl 1.0.x 不能正确处理这种情况。
可以通过删除旧的 DST 根证书来解决此问题。完成此操作后,链将正确构建到 IRSG 根。
* 我的理解是,从技术上讲,“交叉签名”由一个“中间证书”组成,其内容和密钥与 Lets Encrypt 的根证书相同。