由于Let’s Encrypt两个根证书之一的DST Root CA X3在2021/9/29到期,加上OpenSSL1.0的BUG,导致出现异常的安全连接建立失败。具体原因分析可以参考https://zhuanlan.zhihu.com/p/417627543
具体到站点上,WordPress表现在更新时提示“WordPress无法建立到WordPress.org的安全连接”
Nextcloud表现在“概览”检查更新以及连接商店时会报错"cURL error 60: SSL certificate problem: certificate has expired"
检查是否能连接时,可以打开“概览”查看是否能检测到更新,“日志”里是否有错误;不推荐打开插件商店,会导致日志被大量写入而无法打开,可以通过后台删除日志清空
在尝试过网上诸多方法更新证书后,后来检查发现,是PHP编译的OpenSSL版本太低导致
为了解决这个问题,首先更新证书链,参考https://www.jibing57.com/2021/10/09/process-expired-let-s-encrypt-ca-in-centos-7/
# 查看更新
yum list updates -q | grep ca-certificates
# 查看更新日志
rpm -qa --changelog ca-certificates | head -n5
# 安装最新更新
yum -y update ca-certificates
# 检查证书是否还存在
trust list | grep -C3 'DST Root CA X3'
grep -i 'DST Root' /etc/pki/tls/certs/ca-bundle.crt
这样操作之后,Bash里使用curl或者wget的SSL连接应该恢复正常。
接下来,需要手动编译安装新版本OpenSSL,参考https://www.bt.cn/bbs/thread-298-1-1.html
openssl version
wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
tar zxvf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l
./config --prefix=/usr/local/openssl
make && make install
移动至指定位置
mv /usr/bin/openssl /usr/bin/openssl.OFF
mv /usr/include/openssl /usr/include/openssl.OFF
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo "/usr/local/openssl/lib">>/etc/ld.so.conf
ldconfig -v
再检查,发现openssl确实已更新。
但这时phpinfo显示openssl版本依旧是1.0.2,我们需要在宝塔里更新PHP(也可以重新编译安装),之后再查看phpinfo就是高版本了。
至此,PHP的OpenSSL已经升级完毕,站点内通过cURL访问https站点应该恢复正常。