Mensagem de erro
[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol
Também aparece como
- ssl.SSLEOFError: EOF occurred in violation of protocol
Com o OpenSSL 3, o Python mostra o código de motivo “[SSL: UNEXPECTED_EOF_WHILE_READING]”; com o OpenSSL 1.1.1, o texto é só “EOF occurred in violation of protocol”. Em seguida vem uma localização no código-fonte, como “(_ssl.c:1082)”.
Python ssl module (OpenSSL) — ssl.SSLEOFError, SSL_R_UNEXPECTED_EOF_WHILE_READING
O que significa
O outro lado fechou a conexão TCP enquanto o Python ainda estava no handshake TLS (ou no meio da leitura de dados), sem enviar um alerta TLS nem close_notify. O OpenSSL trata esse encerramento silencioso como violação do protocolo. O Python não tem como saber por que o peer saiu; o motivo está no servidor, em um proxy ou em um firewall no caminho.
Por que acontece
O servidor derruba os handshakes que não aceita
comumAlguns servidores e balanceadores de carga fecham a conexão em vez de enviar um alerta quando o ClientHello não tem SNI, não oferece nenhuma versão ou cifra aceitável ou quando o nome não está configurado.
Um proxy, firewall ou VPN corta a conexão
comumConfigurações de proxy erradas (HTTPS_PROXY apontando para uma porta de proxy TLS, NO_PROXY ausente para hosts internos), inspeção profunda de pacotes que bloqueia o destino ou clientes de VPN muitas vezes encerram a conexão TCP em silêncio.
Limitação de taxa ou proteção contra bots
ocasionalAPIs e CDNs sobrecarregadas, ou sistemas antibot que desconfiam da impressão digital TLS do Python, podem derrubar conexões em vez de retornar um erro HTTP.
O servidor fechou a conexão no meio da resposta
ocasionalQuando o erro surge durante a leitura de uma resposta, o servidor ou um proxy encerrou a conexão sem close_notify, por exemplo, depois de um tempo limite esgotado ou de uma falha de um worker.
Como corrigir
- 1.
Reproduzir o handshake com openssl s_client
Se o s_client também for desconectado, varie o SNI e a versão do TLS para ver o que o servidor rejeita; se o s_client funcionar, compare as configurações dele com as do seu cliente Python (proxy, SNI, versões).
bash # Does a plain OpenSSL handshake work from the same machine? openssl s_client -connect api.example.com:443 -servername api.example.com -brief </dev/null # Without SNI, and pinned to TLS 1.2, to see what the server objects to openssl s_client -connect api.example.com:443 -noservername -brief </dev/null openssl s_client -connect api.example.com:443 -servername api.example.com -tls1_2 -brief </dev/null - 2.
Verificar as variáveis de ambiente de proxy
O requests, o urllib e o pip respeitam HTTPS_PROXY e NO_PROXY. Corrija o esquema da URL do proxy e exclua os hosts internos que precisam ser acessados diretamente.
bash env | grep -i -E '^(https?|no|all)_proxy=' # Proxy URLs should normally be http:// (CONNECT tunnel), and internal hosts listed in NO_PROXY export HTTPS_PROXY=http://proxy.example.net:3128 export NO_PROXY=localhost,127.0.0.1,.internal.example.com - 3.
Tentar de novo quando a causa é passageira
Com limitação de taxa e redes instáveis, novas tentativas com intervalo crescente (backoff) transformam quedas esporádicas em sucessos mais lentos; elas não corrigem um servidor que sempre recusa o handshake.
python import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = requests.Session() session.mount("https://", HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1))) session.get("https://api.example.com/")
Erros relacionados
[SSL: WRONG_VERSION_NUMBER] wrong version numberPython ssl module (OpenSSL)curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while…curl (OpenSSL 3 backend)error:0A000126:SSL routines::unexpected eof while readingOpenSSL 3Client network socket disconnected before secure TLS connection was establishedNode.js tls / https / fetch