Mensaje de error
error:0A000126:SSL routines::unexpected eof while reading
También se muestra como
- SSL routines::unexpected eof while reading
La CLI de openssl imprime «<thread id>:error:0A000126:SSL routines::unexpected eof while reading:<source>»; curl lo envuelve como «curl: (56) OpenSSL SSL_read: … unexpected eof while reading, errno 0», y Python, como «[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol».
OpenSSL 3 — SSL_R_UNEXPECTED_EOF_WHILE_READING (peer closed the TCP connection without close_notify)
Qué significa
El otro extremo cerró la conexión TCP sin enviar antes la alerta TLS close_notify, mientras OpenSSL todavía esperaba datos (durante el handshake o a mitad del flujo). OpenSSL 3 lo notifica como un error porque un cierre silencioso no se distingue de un atacante que trunca el flujo; OpenSSL 1.1.1 solo lo notificaba a través de la vía de errores de las llamadas al sistema.
Por qué ocurre
El servidor rechazó o cortó la conexión
frecuenteServidores que cierran los handshakes que no les gustan (SNI desconocido, ninguna versión en común) en lugar de enviar una alerta, o que se caen o agotan el tiempo de espera a mitad de la respuesta.
Un firewall, un proxy o un balanceador de carga cortó la conexión
frecuenteLos tiempos de espera por inactividad, los límites de conexiones y los firewalls que filtran TLS terminan las conexiones TCP sin un cierre TLS.
Un extremo antiguo que nunca envía close_notify
ocasionalAlgunos servidores integrados e implementaciones antiguas cierran el socket después de cada respuesta sin un cierre TLS; con OpenSSL 3, cada una de esas respuestas termina en este error.
Cómo solucionarlo
- 1.
Averiguar cuándo termina la conexión
Si el error aparece antes de que se muestre ningún certificado, el servidor o la red rechazó el handshake; si aparece después de recibir datos, el otro extremo o un dispositivo intermedio cortó el flujo.
bash # During the handshake (no certificate printed) -> the server or network refused the connection # After data was exchanged -> the peer stopped mid-stream echo | openssl s_client -connect api.example.com:443 -servername api.example.com -state 2>&1 | grep -E 'SSL_connect|error' - 2.
Extremos antiguos que controlas: SSL_OP_IGNORE_UNEXPECTED_EOF
OpenSSL 3 puede tratar un cierre silencioso como un final normal del flujo. Úsalo solo con extremos antiguos concretos en los que el propio protocolo detecte el truncamiento (por ejemplo, Content-Length), porque desactiva la detección de truncamiento.
python # Only for peers you control that close without close_notify (legacy embedded servers): # OpenSSL 3 option SSL_OP_IGNORE_UNEXPECTED_EOF, exposed by Python 3.10+ as ssl.OP_IGNORE_UNEXPECTED_EOF import ssl ctx = ssl.create_default_context() ctx.options |= ssl.OP_IGNORE_UNEXPECTED_EOF # truncation is then no longer detected - 3.
Corregir el otro extremo: cerrar TLS correctamente
Enviar close_notify antes de cerrar elimina el error para todos los clientes.
text Server code: call SSL_shutdown() (or the library's close/unwrap) before closing the socket, and delimit HTTP responses with Content-Length or chunked encoding.
Errores relacionados
curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while…curl (OpenSSL 3 backend)[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocolPython ssl module (OpenSSL)Client network socket disconnected before secure TLS connection was establishedNode.js tls / https / fetchGnuTLS recv error (-110): The TLS connection was non-properly terminated.git over HTTPS with libcurl-gnutls (Debian, Ubuntu)