如何强制旧版 debian 忘记 DST Root CA X3 Expiration 并使用 ISRG Root X1 - SSL 证书问题:证书已过期

Posted

技术标签:

【中文标题】如何强制旧版 debian 忘记 DST Root CA X3 Expiration 并使用 ISRG Root X1 - SSL 证书问题:证书已过期【英文标题】:How to force older debian to forget about DST Root CA X3 Expiration and use ISRG Root X1 - SSL certificate problem: certificate has expired 【发布时间】:2021-11-23 06:32:45 【问题描述】:

这与DST Root CA X3 Expiration (September 2021)有关 当在线搜索修复以应用于旧服务器(在我的情况下为 Debian 8)确实调用使用 letencrypt 加密的站点时,它们现在似乎失败并显示以下消息:

例子:

curl -fsSL https://deb.nodesource.com/setup_14.x | bash -

静默失败,然后手动尝试并删除静默标志和 bash 管道,如下所示:

curl -L https://deb.nodesource.com/setup_14.x
curl: (60) SSL certificate problem: certificate has expired
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

尝试以下命令并不能解决问题:

apt update
apt install -y ca-certificates openssl
update-ca-certificates

我能做什么!? (回答我自己的问题)⬇️

【问题讨论】:

【参考方案1】:

免责声明;我不是安全专家(我知道,但你知道)。在应用此处共享的任何修复程序之前,请确保您了解自己所做的事情

通过升级您的实例来修复

升级您的实例。这个问题不会在 debian 9 或更高版本上发生。

在以下示例中,我在基于 Debian 8 的 ruby:2.4.1 docker 映像上遇到了这个问题(可能被认为是旧的)。升级到更新的 docker 镜像可以解决这个问题。升级到更新的 Debian 版本也应该可以解决这个问题。

我确认在使用基于 Debian 11 的 ruby:2.7.0 docker 映像时不会发生这种情况,如下所示:

docker run --rm -it ruby:2.7.4 bash -c "cat /etc/issue"
Debian GNU/Linux 11 \n \l

通过注释 /etc/ca-certificates.conf 中的 DST_Root_CA_X3.crt 来修复 Debian 8

即使 ISRG Root X1 已经到位,如果 DST Root CA X3 仍然存在并在使用中,它的验证似乎首先发生,因此我们可以摆脱这样做:

    安装ca-certificates包 评论/mozilla/DST_Root_CA_X3.crt来自/etc/ca-certificates.conf 确保/usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt 存在(应该存在) 使用update-ca-certificates 更新 ca 证书

直接在您的实例上举例

cat /etc/issue
Debian GNU/Linux 8 \n \l
sudo apt install -y ca-certificates
sudo sed -i '/^mozilla\/DST_Root_CA_X3.crt$/ s/^/!/' /etc/ca-certificates.conf
sudo update-ca-certificates

例如Dockerfile:

FROM ruby:2.4.1 # uses debian 8

RUN apt update -qq \
    && apt install -y ca-certificates \
    && sed -i '/^mozilla\/DST_Root_CA_X3.crt$/ s/^/!/' /etc/ca-certificates.conf \
    && update-ca-certificates \
    && rm -rf /var/lib/apt/lists/*

使用 dpkg-reconfigure ca-certificates 修复

如 cmets 中所述,您还可以在实例上使用以下命令以交互方式修复此问题(需要安装 ca-certificates 包):

dpkg-reconfigure ca-certificates

然后从列表中禁用mozilla/DST_Root_CA_X3.crt

结论

如果您想了解更多信息,请阅读Scott Helme's post: Let's Encrypt's Root Certificate is expiring!

您现在可以curllets 使用这些安全眼镜安全地加密网站:?

【讨论】:

谢谢,这真的很有用,帮助我解决了我遇到的问题。但是您不需要删除任何文件,只需更新/etc/ca-certificates.conf 以在证书前加上! 并更新证书(即@9​​87654340@)。或者运行 dpkg-reconfigure ca-certificates 并使用向导禁用证书。 感谢您的评论,我已经更新了答案以匹配您刚刚分享的内容,肯定更好:) 在 alpine 上,我尝试了您评论旧 DST X3 CA 证书 /etc/ca-certificates.conf 的解决方案并验证 /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt 是否存在.但我收到错误“无法从正在调用容器上运行的 nodejs 应用程序上的 HTTPS 端点的 axios 获取颁发者证书。 @SagarKalburgi 您使用的是哪个版本的 alpine?我尝试了最新的,没有修复它工作正常。例如:docker run --rm -it alpine:latest sh -c "apk add curl && curl https://deb.nodesource.com/setup_15.x" 有效,也许升级到更新的 alpine 镜像会更好 谢谢,通过 dpkg-reconfigure ca-certificates 删除旧的 mozilla/DST_Root_CA_X3.crt 还解决了在 Ubuntu 14 机器上升级 Jenkins 的问题。【参考方案2】:

不清楚您的 Debian 有多“旧”。

拥有最新的 Linux 操作系统不会导致此问题。 在将您的发行版升级到最新版本之前,请考虑!

以下内容适用于我的旧 Debian 和 Ubuntu 系统。

澄清问题在于“cacert-bundle”的 CA Root X3 证书部分。 截至今天,“cacert-bundle”可以在这里找到:https://curl.se/docs/caextract.html 作为捆绑包的一部分https://curl.se/ca/cacert.pem。

过期的证书是:

Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
    44:af:b0:80:d6:a3:27:ba:89:30:39:86:2e:f8:40:6b
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: O=Digital Signature Trust Co., CN=DST Root CA X3
Validity
    Not Before: Sep 30 21:12:19 2000 GMT
    Not After : Sep 30 14:01:15 2021 GMT
    Subject: O=Digital Signature Trust Co., CN=DST Root CA X3
    Subject Public Key Info:
    Public Key Algorithm: rsaEncryption
    Public-Key: (2048 bit)

这用于在 curl 调用中使用 Let's Encrypt 颁发的证书验证对等点。

查找 CURL 正在使用哪个 CA 证书包:

strace curl https://www.google.com |& grep open 

结果:

root@debian:/tmp# strace curl https://www.google.com |& grep open
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libcurl.so.4", O_RDONLY|O_CLOEXEC) = 3
...
...
open("/usr/lib/ssl/openssl.cnf", O_RDONLY) = 3
open("/etc/ssl/certs/ca-certificates.crt", O_RDONLY) = 4
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 4

接近尾声时,您应该会看到证书包。在这种情况下:/etc/ssl/certs/ca-certificates.crt

解决此问题的一个选项是替换该 CA 证书包,但这可能不是您的操作系统和其他受影响的应用程序和包(例如:php libcurl)的全局解决方案。

现在要剖析根 CA 捆绑证书,请使用:

openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt | openssl pkcs7 -print_certs -text -noout | grep "Not After"

注意:命令中的证书位置 (/etc/ssl/certs/ca-certificates.crt) 来自上述“strace”步骤。

这将返回包含捆绑包中所有根 CA 证书到期日期的长列表。

root@L36630:/tmp# openssl crl2pkcs7 -nocrl -certfile cacert.pem | openssl pkcs7 -print_certs -text -noout | grep "Not After"
        Not After : Sep 30 04:20:49 2023 GMT
        Not After : Sep 30 14:01:15 2021 GMT
        Not After : Sep 22 11:22:02 2030 GMT
        Not After : Sep 15 16:00:00 2025 GMT
        ...
        ...

在这种情况下,我们的过期证书是“Not After : Sep 30 14:01:15 2021 GMT”。

您可以删除 | grep "Not After" 查看完整的解密列表。

这是对 cacert 包进行故障排除的分步方法。 如果将来发生这种情况,您知道该怎么做。

现在让我们来解决问题。

修复

Let's Encrypt 最初使用“DST Root CA X3”CA Root 证书。 Let's encrypt 现在使用“ISRG Root X1”和“ISRG Root X2”作为根 CA,“Let's Encrypt R3”作为中间证书。

要解决此问题,您需要将 2 个新的根 CA 添加到您的服务器或设备:

ISRG Root X1(或ISRG Root X1 DER Format) ISRG Root X2(或ISRG Root X2 DER Format)

中间证书(PEM 格式):

Let’s Encrypt R3(或Let’s Encrypt R3 DER Format)

在 Linux 上安装根 CA 证书:

sudo mkdir /usr/local/share/ca-certificates/extra

sudo cp root.cert.pem /usr/local/share/ca-certificates/extra/root.cert.crt

sudo update-ca-certificates

NODEJS

Node.js 7.3.0(以及 LTS 版本 6.10.0 和 4.8.0)添加了 NODE_EXTRA_CA_CERTS 环境变量供您传递 CA 证书文件。

$ export NODE_EXTRA_CA_CERTS=[自定义根 CA 证书文件路径]

或者,您可以将 DST 证书从您的操作系统的 CA 证书包中列入黑名单/删除。

DEBIAN/UBUNTU

您可以使用 dpkg 在 Ubuntu/Debian 中重新配置。

sudo dpkg-reconfigure ca-certificates
    您将看到带有“ca-certificates configuration”的终端窗口 (ca-certificates configuration image 1)。选择“是”以信任来自证书颁发机构的新证书。 按“确定” 该窗口将关闭,在下一步中您将看到带有 CA 证书 (ca-certificates configuration image 1) 的实际列表。按名称“DST_Root_CA_X3.crt”找到证书,取消选中并按“确定”。 现在您将看到“更新 /etc/ssl/certs 中的证书...”。等到该过程完成。

下一步从终端重新测试您的 curl 调用。 您应该不会再看到 CURL 错误:

root@debian:/tmp# curl https://example.com
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

另一种选择(Ubuntu/Debian):

CA 列表存储在文件 /etc/ca-certificates.conf 中。您可以手动编辑此文件并运行:

sudo update-ca-certificates

自动化:

# Make sure the ca-certificates.conf location is correct 
sed '/DST_Root_CA_X3.crt/d' /etc/ca-certificates.conf > /tmp/cacerts.conf && mv /tmp/cacerts.conf /etc/ca-certificates.conf
update-ca-certificates

RHEL/CENTOS

在 RedHat 中将该证书添加到 ca-trust 黑名单:/etc/pki/ca-trust/source/blacklist

    创建 dstrootca.pem 文件:

DST Root CA X3
==============
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

    将文件添加到您的黑名单位置:/etc/pki/ca-trust/source/blacklist

    运行sudo update-ca-trust

来源:https://www.openssl.org/blog/blog/2021/09/13/LetsEncryptRootCertExpire/

Let's Encrypt 正式文章:https://letsencrypt.org/docs/dst-root-ca-x3-expiration-september-2021/

【讨论】:

我真的很喜欢strace curl 的技巧,它可以找出正在使用的配置文件。感谢分享并链接其他来源! :D? 不客气!希望能帮助到你!刚刚添加了如何解密 ca-bundle 并查看到期日期。 我尝试添加新的根 CA 和您提到的中间 CA,但不知何故,我的 nodejs 应用程序上的 axios 不断抛出错误“无法获取颁发者证书” @SagarKalburgi 这里是您的问题的解决方案:***.com/questions/69414479/… 谢谢,但不知何故也没有成功:(

以上是关于如何强制旧版 debian 忘记 DST Root CA X3 Expiration 并使用 ISRG Root X1 - SSL 证书问题:证书已过期的主要内容,如果未能解决你的问题,请参考以下文章

Debian 下忘记root密码的特殊修改方式

设置Debian系统的root登陆的方法

如何在Debian上强制内核更新

Centos7 忘记root密码

Rails 使用时区参数和 DST 强制执行 DateTime 偏移

centos7忘记root密码的解决办法