Pular para o conteúdo
ecdsa.com
Node.js tls / https / fetchMódulo crypto do Node.js

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

Como corrigir

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

Ver toda a base de erros de assinatura