Saltar al contenido
ecdsa.com
Node.js tls.connect / fetch (undici)crypto de Node.js

Mensaje de error

code: 'ERR_SSL_WRONG_VERSION_NUMBER'

También se muestra como

  • ERR_SSL_WRONG_VERSION_NUMBER

El mensaje completo incluye un ID de hilo y una ruta de código fuente, por ejemplo «60747095FFFF0000:error:0A00010B:SSL routines:tls_validate_record_header:wrong version number:../deps/openssl/openssl/ssl/record/methods/tlsany_meth.c:77:», así que busca por el código. tls.connect() y fetch() establecen el código ERR_SSL_WRONG_VERSION_NUMBER; https.request() informa del mismo motivo como «write EPROTO …» con el código EPROTO.

Node.js tls.connect / fetch (undici) — OpenSSL SSL_R_WRONG_VERSION_NUMBER; https.request reports it as write EPROTO

Qué significa

Node.js inició un handshake TLS y la respuesta no era un registro TLS, así que OpenSSL falló al validar el encabezado del registro. El otro extremo habla en texto sin cifrar en ese puerto: un servidor HTTP, un proxy que espera HTTP sin cifrar o un servidor SMTP antes de STARTTLS. Pese al nombre, no hay ningún problema con los certificados ni con las versiones de TLS.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Averiguar qué habla el puerto

    Consulta el puerto con http://; si responde, usa http:// o el verdadero puerto 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.

    Escribir las URL de proxy con http://

    El esquema de la URL del proxy describe la conexión con el proxy, no con el destino; los destinos HTTPS siguen teniendo TLS de extremo a extremo a través del túnel.

    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.

    Correo: usar STARTTLS en el 587 y TLS implícito en el 465

    Con nodemailer, secure: true corresponde al puerto 465; en el 587, mantén secure: false y exige 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 });

Errores relacionados

Explorar toda la base de datos de errores de firma