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
La CA del servidor no es de confianza
frecuenteUna CA privada o de un proxy, o un servidor que omite su certificado intermedio.
Los flujos de PHP no tienen un bundle de CA utilizable
frecuenteopenssl.cafile no está definido en sistemas donde la ruta predeterminada de OpenSSL no tiene bundle (Windows, imágenes mínimas).
Un fallo de protocolo o de algoritmo de cifrado
ocasionalCon otros motivos en la segunda línea («unsupported protocol», «alert handshake failure»), el servidor y PHP no tienen ninguna versión de TLS ni ningún algoritmo de cifrado en común.
Cómo solucionarlo
- 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.
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.
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);