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

目录
自10月1日起,无法通过HTTPS连接到某些网站?
会发生什么
操作系统导致的故障原因及解决方法
适用于 CentOS 7、Amazon Linux 和 Amazon Linux 2
yum -y 更新 ca-certificates
CentOS6 常见错误
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 程序示例
<?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 函数都没有问题。
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
为了解决这个问题
在 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/BAUwAwEB/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