Saltar al contenido
ecdsa.com
PHP streams (file_get_contents, fopen, stream_socket_client, SoapClient, mail libraries)PHP

Mensaje de error

SSL operation failed with code 1. OpenSSL Error messages:

También se muestra como

  • Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:

PHP imprime la advertencia en dos líneas: «SSL operation failed with code 1. OpenSSL Error messages:» seguida del error o los errores de OpenSSL. Las compilaciones con OpenSSL 1.1.1 muestran en su lugar «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

Qué significa

Un flujo de PHP (file_get_contents, fopen, SoapClient, stream_socket_client y las bibliotecas de correo o FTP construidas sobre ellos) falló en su handshake TLS. El código 1 es SSL_ERROR_SSL de OpenSSL; el motivo real está en la línea siguiente y, en la mayoría de los casos, es «error:0A000086:SSL routines::certificate verify failed». Después, PHP añade «Failed to enable crypto» y «Failed to open stream: operation failed», que son consecuencias, no causas.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Leer la línea de OpenSSL que viene a continuación

    Si aparece «certificate verify failed», el problema está en la confianza o en las fechas; los errores de protocolo apuntan a la configuración TLS del 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

    Los flujos de PHP usan openssl.cafile (u openssl.capath); ext-curl usa curl.cainfo, así que define ambos.

    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.

    Pasar una CA para una sola solicitud

    Un contexto de flujo con ssl.cafile confía en una CA privada sin debilitar la verificación para nada más.

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

Errores relacionados

Explorar toda la base de datos de errores de firma