Перейти к содержимому
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 не смог загрузить пакет сертификатов CA, который указал ему PHP, поэтому ни один HTTPS-запрос через ext-curl выполнить нельзя. Путь после двоеточия обычно берётся из curl.cainfo в php.ini (или из 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 или веб-сервер.

    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"

Связанные ошибки

Открыть всю базу ошибок подписей