Message d’erreur
code: 'ERR_SSL_WRONG_VERSION_NUMBER'
Également affiché sous la forme
- ERR_SSL_WRONG_VERSION_NUMBER
Le message complet contient un identifiant de thread et un chemin de fichier source, par exemple « 60747095FFFF0000:error:0A00010B:SSL routines:tls_validate_record_header:wrong version number:../deps/openssl/openssl/ssl/record/methods/tlsany_meth.c:77: » : recherchez donc par le code. tls.connect() et fetch() définissent le code ERR_SSL_WRONG_VERSION_NUMBER ; https.request() signale la même raison sous la forme « write EPROTO … » avec le code EPROTO.
Node.js tls.connect / fetch (undici) — OpenSSL SSL_R_WRONG_VERSION_NUMBER; https.request reports it as write EPROTO
Ce que cela signifie
Node.js a commencé un handshake TLS et la réponse n’était pas un enregistrement TLS : OpenSSL a donc échoué en validant l’en-tête d’enregistrement. Le pair parle en clair sur ce port : un serveur HTTP, un proxy qui attend du HTTP en clair, ou un serveur SMTP avant STARTTLS. Malgré le nom, ni les certificats ni les versions de TLS ne sont en cause.
Pourquoi cela se produit
https:// vers un port qui sert du HTTP en clair
fréquenteDes serveurs de développement locaux, des services internes derrière un proxy qui termine TLS, ou un mauvais numéro de port dans une variable d’environnement.
HTTPS_PROXY ou le https-proxy de npm commençant par https://
fréquenteLa plupart des proxys sortants reçoivent du HTTP en clair de la part du client et ouvrent un tunnel CONNECT ; une URL de proxy en https:// amène le client à démarrer TLS avec le proxy lui-même.
TLS implicite face à un port STARTTLS
occasionnelleLes bibliothèques d’envoi d’e-mails configurées avec secure: true sur le port 587 ou 25 tentent TLS immédiatement, alors que le serveur attend d’abord le message d’accueil SMTP en clair.
Comment corriger l’erreur
- 1.
Déterminer quel protocole parle le port
Interrogez le port en http:// ; s’il répond, utilisez http:// ou le vrai port TLS.
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.
Écrire les URL de proxy avec http://
Le schéma de l’URL du proxy décrit la connexion vers le proxy, pas vers la destination ; les destinations HTTPS bénéficient toujours d’un TLS de bout en bout à travers le 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.
Messagerie : utiliser STARTTLS sur 587 et le TLS implicite sur 465
Avec nodemailer, secure: true va avec le port 465 ; sur 587, gardez secure: false et exigez 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 });
Erreurs associées
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