当 LetsEncrypt 的 ROOT 证书过期时,我无法从旧操作系统访问它。
目录
10 月 1 日之后无法使用 HTTPS 连接到某些网站?
发生的现象
按操作系统分类的原因和解决方案
对于 CentOS7、Amazon Linux、Amazon Linux2
yum -y 更新 ca 证书
CentOS6及常见错误
wget 示例
使用 wget https://LetsEncrypt 证书的站点
--2021-10-04 20:06:18-- https://使用 LetsEncrypt 证书的站点/ 正在使用 LetsEncrypt 证书解析站点... xx.xx.xx.xx 连接到 cLetsEncrypt 的证书 |xx.xx.xx.xx |:443...已连接。错误:无法验证由“/C =US/O=Let's Encrypt/CN=R3”颁发的 LetsEncrypt 证书:颁发的证书已过期。要不安全地连接到使用 LetsEncrypt 证书的站点,请使用“-”。 -无检查证书'。
openssl 命令示例
openssl s_client -connect 使用 LetsEncrypt 证书的站点:443 -servername 使用 LetsEncrypt 证书的站点 < /dev/null
CONNECTED(00000003) ~省略~ 开始时间: 1633378075 超时: 300 (秒) 验证返回码: 10 (证书已过期) --- 完成
使用 openssl 库进行通信的 php 程序示例(可能是 libssl.so.10)
<?php $url = "https://LetsEncryptの証明書を利用しているサイト/"; $output = file_get_contents($url); var_dump($output);
PHP 警告:file_get_contents():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:第 3 行“执行程序”中的证书验证失败 PHP 警告:file_get_contents():无法启用加密第 3 行的“执行程序” PHP 警告:file_get_contents(https://使用 LetsEncrypt 证书的站点/):无法打开流:第 3 行“执行的程序”中的操作失败 bool(false )
使用curl命令或php的curl函数时不会出现该问题。
ldd /usr/bin/curl | grep ssl | 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 | ldd /usr/bin/wget | grep ssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f79a04c6000)
ldd /usr/bin/openssl | grep ssl | ldd /usr/bin/openssl |
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
为了解决问题
CentOS6上强制安装openssl1.0.2的步骤
从 srpm 创建 rpm 包
从 CentOS7 存储库获取 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 -我openssl-1.0.2k-21.el7_9.src.rpm
*在执行rpm命令的用户的主目录下会创建一个名为rpmbuild的目录,并且源代码被提取到那里,因此将其移动到那里。
cd ~/rpmbuild
修改SPEC文件
*“%patch68”是一个不必要的过程,所以将其注释掉。
sed -i -e“s/%patch68/#%patch68/g”规格/openssl.spec
修改补丁文件
*名为 secure_getenv 的 glibc 函数在 CentOS6 中不可用,因此将其替换为 getenv。
sed -i -e“s/secure_getenv/getenv/g”源/openssl-1.0.2a-env-zlib.patch sed -i -e“s/secure_getenv/getenv/g”源/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 根 CA
更新操作系统根证书
yum 更新 ca 证书
启用 update-ca-trust 功能并使用 update-ca-trust 命令更新一次根证书
更新 ca-trust 启用更新 ca-trust
* 使用 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 根 CA b290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJ KoZIhv CNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOE 5CjH9UL2AZd+3UWODYOKIYepLYYHsumu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69ck3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX 69 Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/ wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwaWEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYk QMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9Lww mglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz srzJmwN0jP41ZL9c8 PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdw vYkQsEjgfbKbYK7p2 CNTUQ -----结束证书------
禁用“DST Root CA X3”证书
更新 ca-trust 摘录
grep "DST 根 CA X3" /etc/pki/tls/certs/ca-bundle.crt
*如果没有任何显示就OK了。
grep "ISRG 根 X1" /etc/pki/tls/certs/ca-bundle.crt
*如果显示#ISRG Root X1,则OK。
更新后,尝试运行导致错误的程序,看看问题是否得到解决。
如果服务器上正在运行提供SSL的服务(例如Apache),我们建议重新启动该服务。