错误信息
cURL error 77: error setting certificate file: /etc/ssl/missing-ca.pem
也可能输出为
- error setting certificate file: /etc/ssl/missing-ca.pem
Guzzle 把它格式化为“cURL error 77: error setting certificate file: <path> (see https://curl.se/libcurl/c/libcurl-errors.html) for <url>”;curl_error() 返回的是“cURL error 77: ”之后的部分。如果文件不存在,Guzzle 自己的 verify 选项会更早失败,报出“SSL CA bundle not found: <path>”。
PHP ext-curl (Guzzle, Laravel HTTP client) — CURLE_SSL_CACERT_BADFILE: curl.cainfo names a file that cannot be loaded
含义
libcurl 无法加载 PHP 指定它使用的 CA 证书包,因此无法通过 ext-curl 发起任何 HTTPS 请求。冒号后面的路径通常来自 php.ini 中的 curl.cainfo(或代码中设置的 CURLOPT_CAINFO)。没有任何数据发送到服务器。
原因
从其他系统复制来的 php.ini
常见为其他发行版编写的 curl.cainfo 配置行、Windows 路径,或者从未在这个镜像中安装过的证书包。
Windows:配置的 cacert.pem 已被移动或从未下载
常见PHP 升级并安装到新文件夹后,curl.cainfo 常常仍指向旧的安装目录。
PHP 进程无法读取该文件
偶见PHP-FPM 工作进程以与你的 shell 不同的用户身份运行;只有 root 可读的证书包在那里会加载失败。
修复方法
- 1.
找到该设置并检查文件
php --ini 和 php -i 会显示是哪个文件设置了 curl.cainfo;检查对运行 PHP 的用户而言该路径是否存在(FPM 加载的 php.ini 可能与 CLI 不同)。
bash php --ini php -i | grep -E 'curl.cainfo|openssl.cafile' ls -l "$(php -r 'echo ini_get("curl.cainfo");')" - 2.
让 curl.cainfo 指向实际存在的证书包
在 Linux 上使用发行版的证书包,在 Windows 上使用持续更新的 cacert.pem,然后重新加载 PHP-FPM 或 Web 服务器。
ini ; Linux (Debian/Ubuntu): the system bundle curl.cainfo = "/etc/ssl/certs/ca-certificates.crt" ; Windows: absolute path to an existing cacert.pem ; curl.cainfo = "C:\php\extras\ssl\cacert.pem"