Mensaje de error
cURL error 77: error setting certificate file: /etc/ssl/missing-ca.pem
También se muestra como
- error setting certificate file: /etc/ssl/missing-ca.pem
Guzzle lo formatea como «cURL error 77: error setting certificate file: <path> (see https://curl.se/libcurl/c/libcurl-errors.html) for <url>»; curl_error() devuelve la parte que sigue a «cURL error 77: ». La propia opción verify de Guzzle falla antes, con «SSL CA bundle not found: <path>», cuando falta el archivo.
PHP ext-curl (Guzzle, Laravel HTTP client) — CURLE_SSL_CACERT_BADFILE: curl.cainfo names a file that cannot be loaded
Qué significa
libcurl no pudo cargar el bundle de CA que PHP le indicó, así que no se puede hacer ninguna solicitud HTTPS a través de ext-curl. La ruta que aparece después de los dos puntos suele proceder de curl.cainfo en php.ini (o de CURLOPT_CAINFO, definido en el código). No se envió nada al servidor.
Por qué ocurre
Un php.ini copiado de otro sistema
frecuenteUna línea curl.cainfo escrita para otra distribución, una ruta de Windows o un bundle que nunca se instaló en esta imagen.
Windows: el cacert.pem configurado se movió o nunca se descargó
frecuenteTras una actualización de PHP en una carpeta nueva, curl.cainfo suele seguir apuntando a la instalación anterior.
El proceso de PHP no puede leer el archivo
ocasionalLos procesos worker de PHP-FPM se ejecutan con un usuario distinto del de tu shell; un bundle que solo puede leer root falla ahí.
Cómo solucionarlo
- 1.
Localizar el ajuste y comprobar el archivo
php --ini y php -i muestran qué archivo define curl.cainfo; comprueba que la ruta existe para el usuario que ejecuta PHP (FPM puede cargar un php.ini distinto del de la CLI).
bash php --ini php -i | grep -E 'curl.cainfo|openssl.cafile' ls -l "$(php -r 'echo ini_get("curl.cainfo");')" - 2.
Apuntar curl.cainfo a un bundle existente
Usa el bundle de la distribución en Linux o un cacert.pem mantenido al día en Windows, y recarga PHP-FPM o el servidor 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"