Pular para o conteúdo
ecdsa.com
PHP streams (file_get_contents, fopen, stream_socket_client, SoapClient, mail libraries)PHP

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

Como corrigir

  1. 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. 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. 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);

Erros relacionados

Ver toda a base de erros de assinatura