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
O servidor recusou ou derrubou a conexão
comumServidores que fecham handshakes que não aceitam (SNI desconhecido, nenhuma versão em comum) em vez de enviar um alerta, ou que caem ou esgotam o tempo limite no meio da resposta.
Um firewall, proxy ou balanceador de carga cortou a conexão
comumTempos limite de inatividade, limites de conexão e firewalls que filtram TLS derrubam conexões TCP sem encerrar o TLS.
Um peer legado que nunca envia close_notify
ocasionalAlguns servidores embarcados e implementações antigas fecham o socket depois de cada resposta sem encerrar o TLS; com o OpenSSL 3, cada uma dessas respostas termina neste erro.
Como corrigir
- 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.
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.
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
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)