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
https:// en un puerto que sirve HTTP sin cifrar
frecuenteServidores de desarrollo locales, servicios internos detrás de un proxy que termina TLS o un número de puerto incorrecto en una variable de entorno.
HTTPS_PROXY o el https-proxy de npm escritos como https://
frecuenteLa mayoría de los proxies de reenvío reciben HTTP sin cifrar del cliente y abren un túnel CONNECT; una URL de proxy https:// hace que el cliente inicie TLS con el propio proxy.
TLS implícito contra un puerto STARTTLS
ocasionalLas bibliotecas de correo configuradas con secure: true en el puerto 587 o 25 intentan TLS de inmediato, mientras que el servidor espera primero el saludo SMTP sin cifrar.
Cómo solucionarlo
- 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.
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.
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
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