Aller au contenu
ecdsa.com
Node.js tls.connect / fetch (undici)Node.js crypto

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

Comment corriger l’erreur

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

Parcourir toute la base de données des erreurs de signature