Fehlermeldung
code: 'ERR_SSL_WRONG_VERSION_NUMBER'
Auch ausgegeben als
- ERR_SSL_WRONG_VERSION_NUMBER
Die vollständige Meldung enthält eine Thread-ID und einen Quellpfad, etwa „60747095FFFF0000:error:0A00010B:SSL routines:tls_validate_record_header:wrong version number:../deps/openssl/openssl/ssl/record/methods/tlsany_meth.c:77:“, suche deshalb nach dem Code. tls.connect() und fetch() setzen den Code ERR_SSL_WRONG_VERSION_NUMBER; https.request() meldet denselben Grund als „write EPROTO …“ mit dem Code EPROTO.
Node.js tls.connect / fetch (undici) — OpenSSL SSL_R_WRONG_VERSION_NUMBER; https.request reports it as write EPROTO
Was der Fehler bedeutet
Node.js hat einen TLS-Handshake begonnen, und die Antwort war kein TLS-Record, deshalb ist OpenSSL beim Prüfen des Record-Headers gescheitert. Die Gegenseite spricht auf diesem Port Klartext: ein HTTP-Server, ein Proxy, der einfaches HTTP erwartet, oder ein SMTP-Server vor STARTTLS. Trotz des Namens ist mit Zertifikaten und TLS-Versionen alles in Ordnung.
Warum der Fehler auftritt
https:// an einen Port, der einfaches HTTP spricht
häufigLokale Entwicklungsserver, interne Dienste hinter einem Proxy, der TLS terminiert, oder eine falsche Portnummer in einer Umgebungsvariable.
HTTPS_PROXY oder https-proxy von npm als https:// angegeben
häufigDie meisten Forward-Proxys nehmen vom Client einfaches HTTP entgegen und öffnen einen CONNECT-Tunnel; mit einer Proxy-URL mit https:// beginnt der Client TLS mit dem Proxy selbst.
Implizites TLS gegen einen STARTTLS-Port
gelegentlichMail-Bibliotheken, die mit secure: true auf Port 587 oder 25 konfiguriert sind, versuchen sofort TLS, während der Server zuerst die SMTP-Begrüßung im Klartext erwartet.
So behebst du den Fehler
- 1.
Herausfinden, was der Port spricht
Frag den Port über http:// an; antwortet er, verwende http:// oder den echten TLS-Port.
bash curl -si http://127.0.0.1:8080/ | head -1 # HTTP answers: use http:// or the TLS port openssl s_client -connect 127.0.0.1:8443 -brief </dev/null - 2.
Proxy-URLs mit http:// angeben
Das Schema der Proxy-URL beschreibt die Verbindung zum Proxy, nicht zum Ziel; HTTPS-Ziele bekommen trotzdem Ende-zu-Ende-TLS durch den Tunnel.
bash # Proxy URLs for HTTPS traffic normally start with http:// (CONNECT tunnel) export HTTPS_PROXY=http://proxy.example.net:3128 npm config set https-proxy http://proxy.example.net:3128 - 3.
Mail: STARTTLS auf 587, implizites TLS auf 465 verwenden
Bei nodemailer gehört secure: true zu Port 465; auf 587 lass secure: false stehen und erzwinge STARTTLS.
js // SMTP: secure: true only for implicit TLS (465); 587 upgrades with STARTTLS import nodemailer from "nodemailer"; const transport = nodemailer.createTransport({ host: "smtp.example.com", port: 587, secure: false, requireTLS: true });
Verwandte Fehler
curl: (35) TLS connect error: error:0A00010B:SSL routines::wrong version numbercurl (OpenSSL backend)SSL routines:tls_validate_record_header:wrong version numberOpenSSL 3 (openssl s_client and any OpenSSL-based client)[SSL: WRONG_VERSION_NUMBER] wrong version numberPython ssl module (OpenSSL)http: server gave HTTP response to HTTPS clientGo net/http