Mensagem de erro
cURL error 77: error setting certificate file: /etc/ssl/missing-ca.pem
Também aparece como
- error setting certificate file: /etc/ssl/missing-ca.pem
O Guzzle formata o erro como “cURL error 77: error setting certificate file: <path> (see https://curl.se/libcurl/c/libcurl-errors.html) for <url>”; curl_error() retorna a parte depois de “cURL error 77: ”. A opção verify do próprio Guzzle falha antes, com “SSL CA bundle not found: <path>”, quando o arquivo não existe.
PHP ext-curl (Guzzle, Laravel HTTP client) — CURLE_SSL_CACERT_BADFILE: curl.cainfo names a file that cannot be loaded
O que significa
A libcurl não conseguiu carregar o bundle de CAs que o PHP mandou usar, então nenhuma requisição HTTPS pelo ext-curl pode ser feita. O caminho depois dos dois-pontos geralmente vem de curl.cainfo no php.ini (ou de CURLOPT_CAINFO definido no código). Nada foi enviado ao servidor.
Por que acontece
Um php.ini copiado de outro sistema
comumUma linha curl.cainfo escrita para outra distribuição, um caminho do Windows ou um bundle que nunca foi instalado nesta imagem.
Windows: o cacert.pem configurado foi movido ou nunca foi baixado
comumDepois que o PHP é atualizado em uma pasta nova, curl.cainfo muitas vezes ainda aponta para a instalação antiga.
O processo do PHP não consegue ler o arquivo
ocasionalOs workers do PHP-FPM rodam com um usuário diferente do seu shell; um bundle que só o root consegue ler falha ali.
Como corrigir
- 1.
Encontrar a configuração e verificar o arquivo
Os comandos php --ini e php -i mostram qual arquivo define curl.cainfo; confira se o caminho existe para o usuário que executa o PHP (o FPM pode carregar um php.ini diferente do da CLI).
bash php --ini php -i | grep -E 'curl.cainfo|openssl.cafile' ls -l "$(php -r 'echo ini_get("curl.cainfo");')" - 2.
Apontar curl.cainfo para um bundle que exista
Use o bundle da distribuição no Linux ou um cacert.pem mantido em dia no Windows, e recarregue o PHP-FPM ou o 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"