当 LetsEncrypt 的 ROOT 证书过期时,我无法从旧操作系统访问它。

在加拿大,当你在星巴克点餐时,他们会问你的名字(在日本也会问吗?),但是当我说“Seiken”时,他们完全听不懂。
我是一个胆小的圣人,总是想着下次要用一个时髦的英文名字,但真到了那个时候,我却不好意思说出口。

自10月1日起,无法通过HTTPS连接到某些网站?

在“DST Root CA X3”(2021年9月30日)到期后,LetsEncrypt的根证书被更改为跨根证书,该证书也使用证书颁发机构“ISRG Root X1”,有效期至2035年。然而,自“DST Root CA X3”于10月1日到期以来,在某些环境中访问使用LetsEncrypt证书的网站时,出现了SSL证书错误。
我相信很多人都遇到了同样的问题,所以我希望这篇文章能帮助到正在为此苦恼的你们。

会发生什么

连接到使用 Let's Encrypt 的网站时(交叉根证书为“ISRG Root X1”和“DST Root CA X3”),我收到 SSL 错误。

操作系统导致的故障原因及解决方法

适用于 CentOS 7、Amazon Linux 和 Amazon Linux 2

大多数情况下,操作系统中安装的根证书版本过旧,并且操作系统根证书树中不存在“ISRG Root X1”根证书。请使用以下命令更新根证书。
yum -y 更新 ca-certificates
如果 openssl 版本过旧(1.0.1 或更早版本),也可能出现问题,因此请将 openssl 升级到最新版本。

CentOS6 常见错误

交叉签名证书验证需要 openssl 1.0.2 或更高版本,但 CentOS 6 已不再受支持,仅提供 1.0.1 及更早版本。
由于 openssl 1.0.1 及以下版本未实现 SSL 证书的部分链功能,因此无法正确执行证书验证,从而导致 SSL 通信错误。
以下是一些常见错误模式的示例:

wget 示例

使用 Let's Encrypt 证书通过 wget 下载 https://site
执行结果
--2021-10-04 20:06:18-- https://site using Let'sEncrypt certificate/ 正在解析使用 Let'sEncrypt 证书的网站... xx.xx.xx.xx 正在连接到使用 Let'sEncrypt 证书的网站|xx.xx.xx.xx|:443... 已连接。错误:无法验证使用 Let'sEncrypt 证书的网站的证书,该证书由“/C=US/O=Let's Encrypt/CN=R3”颁发:颁发的证书已过期。要以不安全的方式连接到使用 Let'sEncrypt 证书的网站,请使用“--no-check-certificate”。.

OpenSSL 命令示例

openssl s_client -connect Site using LetsEncrypt certificate:443 -servername Site using LetsEncrypt certificate < /dev/null
执行结果
已连接(00000003) ~省略~ 开始时间:1633378075 超时时间:300 秒 验证返回码:10(证书已过期) --- 完成

一个使用 openssl 库(可能是 libssl.so.10)进行通信的 php 程序示例

如下所示,使用 get_file_contents 函数的程序中证书验证失败。
示例代码
<?php $url = "https://LetsEncryptの証明書を利用しているサイト/"; $output = file_get_contents($url); var_dump($output);
执行结果
PHP 警告:file_get_contents():SSL 操作失败,错误代码为 1。OpenSSL 错误信息:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in "The executed program" on line 3 PHP 警告:file_get_contents():Failed to enable crypto in "The executed program" on line 3 PHP 警告:file_get_contents(https://site using LetsEncrypt certificate/): failed to open stream: operation failed in "The executed program" on line 3 bool(false)

使用 curl 命令或 php curl 函数都没有问题。

这可能是因为 curl 命令使用的加密通信相关库不仅包括基于 openssl 的 libssl.so.10,还包括基于 NSS 的 libssl3.so。
ldd /usr/bin/curl | grep ssl

libssl3.so => /usr/lib64/libssl3.so (0x00007f43fc44b000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f43fb1c5000)

ldd /usr/bin/wget | grep ssl

libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f79a04c6000)

ldd /usr/bin/openssl | grep ssl

libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f2872a3a000)

rpm -qf /usr/lib64/libssl3.so

nss-3.44.0-7.el6_10.x86_64

rpm -qf /usr/lib64/libssl.so.10

openssl-1.0.1e-58.el6_10.x86_64

为了解决这个问题

您需要修改您的程序以使用 curl 命令或基于 curl 的库,或者使用 openssl 版本 1.0.2 或更高版本。
如上所述,CentOS 6 没有提供高于 1.0.1 的版本,因此如果修改程序比较困难,可以通过从 CentOS 7 存储库获取 SRPM,将其修改为适用于 CentOS 6,然后构建并安装来避免该问题。
原文链接
*此程序已证明在我们公司实际运行的服务器上有效,但请注意,我们尚未能够确认 OpenSSL 所有功能的影响和运行情况。
从根本上讲,我们建议您更新操作系统。

在 CentOS 6 上强制安装 openssl 1.0.2 的步骤

从 srpm 创建 rpm 包

从 CentOS 7 软件仓库获取 openssl 1.0.2 srpm 软件包

cd /usr/local/src wget --no-check-certificate https://vault.centos.org/7.9.2009/updates/Source/SPackages/openssl-1.0.2k-21.el7_9.src.rpm rpm -i openssl-1.0.2k-21.el7_9.src.rpm

*将在执行 rpm 命令的用户的家目录下创建一个名为 rpmbuild 的目录,并将源代码提取出来,因此请进入该目录。

cd ~/rpmbuild

修改 SPEC 文件

*"%patch68" 是不必要的处理,所以请将其注释掉。

sed -i -e "s/%patch68/#%patch68/g" SPECS/openssl.spec

 

修改补丁文件

*CentOS6 中不存在 glibc 函数 secure_getenv,因此请将其替换为 getenv。

sed -i -e "s/secure_getenv/getenv/g" SOURCES/openssl-1.0.2a-env-zlib.patch sed -i -e "s/secure_getenv/getenv/g" SOURCES/openssl-1.0.2j-deprecate-algos.patch sed -i -e "s/secure_getenv/getenv/g" SOURCES/openssl-1.0.2a-fips-ctor.patch

 

构建 rpm 包

*如果构建所需的工具尚未安装,请在运行 rpmbuild 之前安装它们。

yum install rpm-build krb5-devel zkib-devel lksctp-tools-devel zlib-devel gcc rpmbuild -ba SPECS/openssl.spec

 

安装 rpm 包

安装所需的依赖包(perl-WWW-Curl)

使用 yum 安装 perl-WWW-Curl

 

进入 rpm 软件包的构建目录,并使用 rpm 命令进行安装。

cd RPMS/rpm -Uvh openssl-*

 

检查版本是否已更新

openssl 版本

*如果结果是 1.0.2k,则表示成功。

 

禁用 DST 根 CA X3 证书

*如果操作系统根证书中仍然保留着DST Root CA X3证书,则问题无法解决。无论如何,该证书已过期,因此应将其禁用。

更新操作系统根证书

yum update ca-certificates

 

启用 update-ca-trust 功能,并使用 update-ca-trust 命令更新一次根证书。

启用 update-ca-trust 更新 CA 信任

*使用 yum update ca-certificates 更新根证书后,操作系统的受信任根证书文件(/pki/tls/certs/ca-bundle.crt)不仅包含证书内容,还包含颁发者和到期日期等注释。

这不会影响操作系统的运行,但如果您在运行 update-ca-trust 命令时不带任何参数,操作系统的受信任根证书将被整理到一个仅包含证书内容和注释的文件中。请
务必运行此命令,以确保下一个命令仅提取证书部分。

仅提取“DST Root CA X3”证书并将其保存为 /etc/pki/ca-trust/source/blacklist/ 目录下的文件。

perl -e 'while(<>){last if $_ =~ m/DST Root CA X3/;}print $_;while(<>){last if length($_)==1;print $_}'</etc/pki/tls/certs/ca-bundle.crt > /etc/pki/ca-trust/source/blacklist/DST_Root_CA_X3.pem

*如果创建了名为 /etc/pki/ca-trust/source/blacklist/DST_Root_CA_X3.pem 的文件,并且其内容如下所示,则一切正常。如果此方法无效,您可以手动创建该文件。

#DST Root CA MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IumTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69ck3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BA​​UwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----证书结束----

禁用“DST Root CA X3”证书

更新 CA 信托提取
grep "DST Root CA X3" /etc/pki/tls/certs/ca-bundle.crt

*如果没有显示任何内容,则表示正常。

grep "ISRG Root X1" /etc/pki/tls/certs/ca-bundle.crt

*如果显示 # ISRG Root X1,则没问题。

更新后,请尝试运行之前出现错误的程序,看看问题是否已解决。

如果服务器上正在运行提供 SSL 的服务(例如 Apache),我们建议重新启动该服务。

 

如果您觉得这篇文章有帮助,请点赞!
3
加载中...
3 票,平均:1.00 / 13
26,979
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

佐藤圣坚

我在紧要关头有很好的第六感,但我基本上是一个老派工程师。目前,
我在加拿大办事处工作。