Mensagem de erro
SSL operation failed with code 1. OpenSSL Error messages:
Também aparece como
- Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
O PHP imprime o aviso em duas linhas: “SSL operation failed with code 1. OpenSSL Error messages:” seguido do erro (ou dos erros) do OpenSSL. Builds com OpenSSL 1.1.1 mostram, em vez disso, “error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed”.
PHP streams (file_get_contents, fopen, stream_socket_client, SoapClient, mail libraries) — openssl stream wrapper
O que significa
Um stream do PHP (file_get_contents, fopen, SoapClient, stream_socket_client e as bibliotecas de e-mail ou FTP construídas sobre eles) falhou no handshake TLS. O código 1 é o SSL_ERROR_SSL do OpenSSL; o motivo real está na linha seguinte, na maioria das vezes “error:0A000086:SSL routines::certificate verify failed”. Depois, o PHP acrescenta “Failed to enable crypto” e “Failed to open stream: operation failed”, que são consequências, não causas.
Por que acontece
O PHP não confia na CA do servidor
comumUma CA privada ou de proxy, ou um servidor que omite o certificado intermediário.
Os streams do PHP não têm um bundle de CAs utilizável
comumopenssl.cafile não está definido em sistemas nos quais o caminho padrão do OpenSSL não tem bundle (Windows, imagens mínimas).
Uma falha de protocolo ou de cifra
ocasionalQuando a segunda linha traz outros motivos (“unsupported protocol”, “alert handshake failure”), o servidor e o PHP não têm nenhuma versão de TLS ou cifra em comum.
Como corrigir
- 1.
Ler a linha do OpenSSL que vem a seguir
“certificate verify failed” indica um problema de confiança ou de datas; erros de protocolo apontam para a configuração TLS do servidor.
text Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:0A000086:SSL routines::certificate verify failed <- trust/chain/date problem Warning: file_get_contents(): Failed to enable crypto <- consequence, not the cause - 2.
Definir openssl.cafile
Os streams do PHP usam openssl.cafile (ou openssl.capath); o ext-curl usa curl.cainfo, então defina os dois.
ini ; php.ini — CA bundle for PHP streams (file_get_contents, SoapClient, stream_socket_client) openssl.cafile = "/etc/ssl/certs/ca-certificates.crt" - 3.
Passar uma CA para uma única requisição
Um contexto de stream com ssl.cafile confia em uma CA privada sem enfraquecer a verificação de mais nada.
php // One request with a private CA; verification stays on $context = stream_context_create(['ssl' => [ 'cafile' => '/etc/ssl/private-ca/corp-root-ca.pem', 'verify_peer' => true, 'verify_peer_name' => true, ]]); $body = file_get_contents('https://api.example.com/', false, $context);