Mensagem de erro
Client network socket disconnected before secure TLS connection was established
Também aparece como
- code: 'ECONNRESET'
Com fetch(), ele é a causa de “TypeError: fetch failed”; o npm e o yarn o imprimem dentro das mensagens “request to … failed”. As mesmas palavras com outro código (por exemplo, ETIMEDOUT) apontam para um tempo limite esgotado, e não para uma conexão redefinida.
Node.js tls / https / fetch — code ECONNRESET during the TLS handshake
O que significa
A conexão TCP foi fechada pelo outro lado (ou por algo no meio do caminho) depois que o Node.js enviou o ClientHello e antes de o handshake TLS terminar. Nenhum alerta TLS chegou, então o Node.js não tem como dizer o motivo; ele informa uma conexão redefinida, com o código ECONNRESET. O motivo está no servidor, em um proxy ou em um firewall, e não no certificado.
Por que acontece
Um proxy corporativo é obrigatório, mas não está sendo usado (ou está mal configurado)
comumRedes que só permitem HTTPS de saída por um proxy muitas vezes deixam a conexão TCP ser estabelecida e depois derrubam o handshake. Por padrão, o Node.js não lê HTTPS_PROXY, então ferramentas que funcionam no navegador falham aqui.
Um firewall ou filtro de TLS derruba o handshake
comumFirewalls de nova geração bloqueiam pelo SNI ou pela impressão digital TLS e simplesmente fecham a conexão; clientes de VPN e filtragem de DNS podem fazer o mesmo.
O servidor fecha handshakes que não consegue atender
ocasionalAlguns servidores e balanceadores de carga fecham a conexão em vez de enviar um alerta quando falta o SNI, o nome é desconhecido ou nenhuma versão do protocolo é compatível.
Sobrecarga, limite de taxa ou limite de conexões
ocasionalServidores no limite de conexões, ou limitadores de taxa a montante, redefinem novas conexões; o erro então aparece de forma intermitente sob carga.
Como corrigir
- 1.
Verificar as configurações de proxy
Compare o ambiente com o que o seu navegador usa (muitas vezes um arquivo PAC). Normalmente, URLs de proxy devem ser http://, e hosts internos devem ficar em NO_PROXY.
bash env | grep -i -E '^(https?|no)_proxy=' npm config get proxy; npm config get https-proxy # Proxy URL with http:// and internal hosts in NO_PROXY export HTTPS_PROXY=http://proxy.example.net:3128 NO_PROXY=localhost,127.0.0.1,.internal.example.com - 2.
Repetir o handshake com openssl s_client
Se o s_client também é cortado, o problema é a rede ou o servidor; varie o SNI para ver se o servidor precisa dele.
bash # Same handshake without Node.js: does the server or network cut it too? openssl s_client -connect api.example.com:443 -servername api.example.com -brief </dev/null openssl s_client -connect api.example.com:443 -noservername -brief </dev/null - 3.
Fazer o Node.js usar as variáveis de ambiente de proxy
Versões recentes do Node.js respeitam HTTP_PROXY, HTTPS_PROXY e NO_PROXY em http, https e fetch quando NODE_USE_ENV_PROXY=1 está definido; bibliotecas como axios, got ou o ProxyAgent do undici têm as próprias opções de proxy.
bash # Node.js does not use HTTPS_PROXY by itself; recent releases can be told to NODE_USE_ENV_PROXY=1 HTTPS_PROXY=http://proxy.example.net:3128 node app.js
Erros relacionados
[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocolPython ssl module (OpenSSL)code: 'ERR_SSL_WRONG_VERSION_NUMBER'Node.js tls.connect / fetch (undici)javax.net.ssl.SSLHandshakeException: Remote host terminated the handshakeJava (JSSE)error:0A000126:SSL routines::unexpected eof while readingOpenSSL 3