Pular para o conteúdo
ecdsa.com
Node.js tls.connect / fetch (undici)Módulo crypto do Node.js

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

Como corrigir

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

Ver toda a base de erros de assinatura