跳到主要内容
ecdsa.com
PHP ext-curl (Guzzle, Laravel HTTP client)PHP

错误信息

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)。没有任何数据发送到服务器。

原因

修复方法

  1. 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. 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"

相关错误

浏览完整的签名错误库