Pular para o conteúdo
ecdsa.com
OpenSSL 3CLI do OpenSSL

Mensagem de erro

error:0A000126:SSL routines::unexpected eof while reading

Também aparece como

  • SSL routines::unexpected eof while reading

A CLI do openssl imprime “<thread id>:error:0A000126:SSL routines::unexpected eof while reading:<source>”; o curl o encapsula como “curl: (56) OpenSSL SSL_read: … unexpected eof while reading, errno 0”, e o 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)

O que significa

O peer fechou a conexão TCP sem antes enviar o alerta TLS close_notify, enquanto o OpenSSL ainda esperava dados (durante o handshake ou no meio do fluxo). O OpenSSL 3 informa isso como erro porque um fechamento silencioso não se distingue de um atacante que trunca o fluxo; o OpenSSL 1.1.1 só o informava pelo caminho de erro de chamada de sistema.

Por que acontece

Como corrigir

  1. 1.

    Descobrir quando a conexão termina

    Se o erro aparece antes que qualquer certificado seja exibido, o servidor ou a rede recusou o handshake; se aparece depois da troca de dados, o peer ou um equipamento intermediário cortou o fluxo.

    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.

    Peers legados sob seu controle: SSL_OP_IGNORE_UNEXPECTED_EOF

    O OpenSSL 3 pode tratar um fechamento silencioso como fim normal do fluxo. Use essa opção só com peers legados específicos em que o próprio protocolo detecta o truncamento (por exemplo, com Content-Length), já que ela desativa a detecção de truncamento.

    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.

    Corrigir o peer: encerrar o TLS corretamente

    Enviar close_notify antes de fechar elimina o erro para todos os 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.

Erros relacionados

Ver toda a base de erros de assinatura