Pular para o conteúdo
ecdsa.com
OpenSSL 3 (openssl s_client and any OpenSSL-based client)CLI do OpenSSL

Mensagem de erro

SSL routines:tls_validate_record_header:wrong version number

Também aparece como

  • error:0A00010B:SSL routines:ssl3_get_record:wrong version number
  • error:0A00010B:SSL routines::wrong version number
  • error:1408F10B:SSL routines:ssl3_get_record:wrong version number

No OpenSSL 3.5, a mensagem traz a função tls_validate_record_header; no OpenSSL 3.0, ssl3_get_record (“error:0A00010B:SSL routines:ssl3_get_record:wrong version number”); o OpenSSL 1.1.1 usa o código mais antigo 1408F10B. Aplicativos que formatam erros sem o nome da função (mensagens do curl e do Node.js) imprimem “error:0A00010B:SSL routines::wrong version number”. O prefixo antes de “error:” é um ID de thread, e o sufixo, uma localização no código-fonte; os dois variam.

OpenSSL 3 (openssl s_client and any OpenSSL-based client) — SSL_R_WRONG_VERSION_NUMBER

O que significa

O OpenSSL esperava um registro TLS e verificou o campo de versão do protocolo no cabeçalho, mas os bytes que recebeu nem sequer são TLS — normalmente são o início de uma resposta HTTP ou a saudação em texto de um servidor de e-mail, interpretados como se fossem um número de versão. O nome engana: o peer está falando outro protocolo (ou texto claro) nessa porta, e não uma versão de TLS sem suporte.

Por que acontece

Como corrigir

  1. 1.

    Usar -starttls em protocolos que fazem upgrade na própria conexão

    O openssl s_client aceita smtp, imap, pop3, ftp, xmpp, ldap, postgres, mysql e outros; com essa opção, o handshake TLS começa depois do comando de upgrade do protocolo.

    bash
    # Protocols that upgrade in-band need -starttls
    openssl s_client -connect mail.example.com:587 -starttls smtp -servername mail.example.com </dev/null
    openssl s_client -connect db.example.com:5432 -starttls postgres </dev/null
    openssl s_client -connect ldap.example.com:389 -starttls ldap </dev/null
  2. 2.

    Ver o que a porta realmente envia

    Um banner de texto ou uma linha de status HTTP no netcat mostra que a porta não usa TLS implícito.

    bash
    # What does the port answer with? A readable banner means it is not TLS
    printf 'HEAD / HTTP/1.0\r\n\r\n' | timeout 3 nc api.example.com 8080 | head -3
    timeout 3 nc mail.example.com 587 </dev/null | head -1     # "220 ... ESMTP" = SMTP, STARTTLS port
  3. 3.

    Conectar-se à porta de TLS implícito

    Use a porta TLS do protocolo quando o cliente não for compatível com STARTTLS.

    bash
    # Implicit TLS ports: 443 (HTTPS), 465 (SMTPS), 993 (IMAPS), 995 (POP3S), 636 (LDAPS)
    openssl s_client -connect mail.example.com:465 -servername mail.example.com -brief </dev/null

Erros relacionados

Ver toda a base de erros de assinatura