Saltar al contenido
ecdsa.com
OpenSSL 3CLI de OpenSSL

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

Cómo solucionarlo

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

Explorar toda la base de datos de errores de firma