Fehlermeldung
cURL error 77: error setting certificate file: /etc/ssl/missing-ca.pem
Auch ausgegeben als
- error setting certificate file: /etc/ssl/missing-ca.pem
Guzzle formatiert die Meldung als „cURL error 77: error setting certificate file: <path> (see https://curl.se/libcurl/c/libcurl-errors.html) for <url>“; curl_error() gibt den Teil nach „cURL error 77: “ zurück. Fehlt die Datei, scheitert schon vorher die eigene Option verify von Guzzle, und zwar mit „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
Was der Fehler bedeutet
libcurl konnte das von PHP vorgegebene CA-Bundle nicht laden, deshalb ist über ext-curl keine HTTPS-Anfrage möglich. Der Pfad nach dem Doppelpunkt stammt meist aus curl.cainfo in der php.ini (oder aus CURLOPT_CAINFO, das der Code setzt). An den Server wurde nichts gesendet.
Warum der Fehler auftritt
Eine von einem anderen System kopierte php.ini
häufigEine Zeile mit curl.cainfo, die für eine andere Distribution geschrieben wurde, ein Windows-Pfad oder ein Bundle, das in diesem Image nie installiert wurde.
Windows: Die konfigurierte cacert.pem wurde verschoben oder nie heruntergeladen
häufigNach einem PHP-Upgrade in einen neuen Ordner zeigt curl.cainfo oft noch auf die alte Installation.
Der PHP-Prozess kann die Datei nicht lesen
gelegentlichPHP-FPM-Worker laufen unter einem anderen Benutzer als deine Shell; ein Bundle, das nur root lesen darf, scheitert dort.
So behebst du den Fehler
- 1.
Einstellung finden und Datei prüfen
php --ini und php -i zeigen, welche Datei curl.cainfo setzt; prüfe, ob der Pfad für den Benutzer existiert, unter dem PHP läuft (FPM lädt unter Umständen eine andere php.ini als die CLI).
bash php --ini php -i | grep -E 'curl.cainfo|openssl.cafile' ls -l "$(php -r 'echo ini_get("curl.cainfo");')" - 2.
curl.cainfo auf ein vorhandenes Bundle verweisen lassen
Verwende unter Linux das Bundle der Distribution oder unter Windows eine gepflegte cacert.pem und lade PHP-FPM oder den Webserver neu.
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"