Сообщение об ошибке
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, заданного в коде). На сервер ничего не отправлено.
Почему это происходит
php.ini скопирован из другой системы
частоСтрока curl.cainfo, написанная для другого дистрибутива, путь в формате Windows или пакет сертификатов, который так и не был установлен в этот образ.
Windows: указанный cacert.pem перемещён или так и не был скачан
частоПосле обновления PHP с установкой в новую папку curl.cainfo часто по-прежнему указывает на старую установку.
Процесс PHP не может прочитать файл
иногдаРабочие процессы PHP-FPM запускаются от имени другого пользователя, не того, под которым работает ваша оболочка; пакет сертификатов, доступный для чтения только 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 или веб-сервер.
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"