如何更新php5.6-curl以支持验证Let's Encrypt新X1证书
适配方案
方案1:重新编译php5.6-curl扩展绑定新的openssl/curl
这是最彻底的解决方案,原有ondrej源的php5.6-curl默认绑定Ubuntu14.04自带的旧版openssl,单独更新系统openssl和curl不会自动同步到php扩展,需要手动重编译:
- 首先验证当前php-curl绑定的ssl版本:
如果输出版本低于你安装的openssl 1.1.1b,说明扩展未关联新版openssl。php -r "var_dump(curl_version()['ssl_version']);" - 安装php5.6开发依赖:
apt-get install php5.6-dev - 进入php5.6源码的curl扩展目录,执行编译流程:
cd /usr/src/php5.6/ext/curl phpize # 替换为你实际安装新版openssl和curl的路径 ./configure --with-curl=/usr/local/curl --with-openssl-dir=/usr/local/openssl make && make install - 重启php-fpm或apache服务后重新执行版本验证命令,确认ssl版本更新后测试请求即可。
方案2:手动指定CA证书路径(无编译需求,快速生效)
如果编译扩展门槛较高,可直接通过配置指定ISRG Root X1根证书的路径:
- 先将ISRG Root X1的PEM格式证书存入服务器固定路径,例如
/usr/local/share/ca-certificates/isrgrootx1.pem - 全局生效配置:修改php.ini添加以下两行,重启php服务即可
curl.cainfo = "/usr/local/share/ca-certificates/isrgrootx1.pem" openssl.cafile = "/usr/local/share/ca-certificates/isrgrootx1.pem" - 单请求生效配置:在代码的curl请求逻辑中添加配置项,无需修改全局配置
curl_setopt($ch, CURLOPT_CAINFO, '/usr/local/share/ca-certificates/isrgrootx1.pem'); // 保留ssl校验逻辑,不要关闭VERIFYPEER规避问题 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
方案3:清理旧根证书冲突
如果执行上述方案后仍然异常,检查系统信任的CA证书列表,移除已过期的DST Root CA X3证书避免证书链回退:
sed -i 's/mozilla\/DST_Root_CA_X3.crt/!mozilla\/DST_Root_CA_X3.crt/g' /etc/ca-certificates.conf update-ca-certificates
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

