Fehlermeldung
Client network socket disconnected before secure TLS connection was established
Auch ausgegeben als
- code: 'ECONNRESET'
Bei fetch() ist der Fehler die Ursache (cause) von „TypeError: fetch failed“; npm und yarn geben ihn innerhalb ihrer Meldungen „request to … failed“ aus. Derselbe Wortlaut mit einem anderen Code (zum Beispiel ETIMEDOUT) deutet eher auf einen Timeout als auf einen Reset hin.
Node.js tls / https / fetch — code ECONNRESET during the TLS handshake
Was der Fehler bedeutet
Die TCP-Verbindung wurde von der Gegenseite (oder von etwas dazwischen) geschlossen, nachdem Node.js sein ClientHello gesendet hatte und bevor der TLS-Handshake abgeschlossen war. Es kam kein TLS-Alert an, deshalb kann Node.js den Grund nicht nennen; es meldet einen Reset mit dem Code ECONNRESET. Der Grund liegt beim Server, einem Proxy oder einer Firewall, nicht im Zertifikat.
Warum der Fehler auftritt
Ein Firmenproxy ist vorgeschrieben, wird aber nicht verwendet (oder ist falsch konfiguriert)
häufigNetze, die ausgehendes HTTPS nur über einen Proxy erlauben, lassen den TCP-Verbindungsaufbau oft zu und verwerfen dann den Handshake. Node.js liest HTTPS_PROXY standardmäßig nicht, deshalb scheitern hier Tools, die im Browser funktionieren.
Eine Firewall oder ein TLS-Filter verwirft den Handshake
häufigNext-Generation-Firewalls blockieren anhand von SNI oder TLS-Fingerabdruck und schließen einfach die Verbindung; VPN-Clients und DNS-Filterung können dasselbe bewirken.
Der Server bricht Handshakes ab, die er nicht bedienen kann
gelegentlichManche Server und Load Balancer schließen die Verbindung, statt einen Alert zu senden, wenn SNI fehlt, der Name unbekannt ist oder keine Protokollversion passt.
Überlast, Rate Limiting oder Verbindungslimits
gelegentlichServer am Verbindungslimit oder vorgelagerte Rate Limiter setzen neue Verbindungen zurück; der Fehler tritt dann unter Last sporadisch auf.
So behebst du den Fehler
- 1.
Proxy-Einstellungen prüfen
Vergleiche die Umgebung mit dem, was dein Browser verwendet (oft eine PAC-Datei). Proxy-URLs sollten normalerweise mit http:// beginnen, und interne Hosts gehören in 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.
Handshake mit openssl s_client wiederholen
Wird auch s_client getrennt, liegt das Problem im Netzwerk oder beim Server; variiere SNI, um zu sehen, ob der Server es braucht.
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.
Node.js die Proxy-Umgebungsvariablen verwenden lassen
Aktuelle Node.js-Releases berücksichtigen HTTP_PROXY, HTTPS_PROXY und NO_PROXY für http, https und fetch, wenn NODE_USE_ENV_PROXY=1 gesetzt ist; Bibliotheken wie axios, got oder der ProxyAgent von undici haben eigene Proxy-Optionen.
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
Verwandte Fehler
[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