Mensagem de erro
code: 'ERR_SSL_WRONG_VERSION_NUMBER'
Também aparece como
- ERR_SSL_WRONG_VERSION_NUMBER
A mensagem completa inclui um ID de thread e um caminho de código-fonte, por exemplo, “60747095FFFF0000:error:0A00010B:SSL routines:tls_validate_record_header:wrong version number:../deps/openssl/openssl/ssl/record/methods/tlsany_meth.c:77:”, então busque pelo código. O tls.connect() e o fetch() definem o código ERR_SSL_WRONG_VERSION_NUMBER; o https.request() relata o mesmo motivo como “write EPROTO …”, com o código EPROTO.
Node.js tls.connect / fetch (undici) — OpenSSL SSL_R_WRONG_VERSION_NUMBER; https.request reports it as write EPROTO
O que significa
O Node.js iniciou um handshake TLS, e a resposta não era um registro TLS, então o OpenSSL falhou ao validar o cabeçalho do registro. O outro lado fala texto claro nessa porta: um servidor HTTP, um proxy que espera HTTP não criptografado ou um servidor SMTP antes do STARTTLS. Apesar do nome, não há nada de errado com certificados nem com versões de TLS.
Por que acontece
https:// para uma porta que serve HTTP não criptografado
comumServidores de desenvolvimento locais, serviços internos atrás de um proxy que faz a terminação TLS ou um número de porta errado em uma variável de ambiente.
HTTPS_PROXY ou o https-proxy do npm escrito como https://
comumA maioria dos proxies de encaminhamento recebe HTTP não criptografado do cliente e abre um túnel CONNECT; uma URL de proxy com https:// faz o cliente iniciar o TLS com o próprio proxy.
TLS implícito em uma porta STARTTLS
ocasionalBibliotecas de e-mail configuradas com secure: true na porta 587 ou 25 tentam TLS imediatamente, enquanto o servidor espera primeiro a saudação SMTP em texto claro.
Como corrigir
- 1.
Descobrir o que a porta fala
Faça uma requisição à porta com http://; se ela responder, use http:// ou a porta TLS correta.
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.
Escrever URLs de proxy com http://
O esquema da URL do proxy descreve a conexão com o proxy, e não com o destino; destinos HTTPS continuam tendo TLS de ponta a ponta pelo 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.
E-mail: usar STARTTLS na 587 e TLS implícito na 465
No nodemailer, secure: true é para a porta 465; na 587, mantenha secure: false e exija 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 });
Erros 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