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
A porta serve HTTP não criptografado ou outro protocolo não criptografado
comumHTTP nas portas 80/8080, um backend atrás de um proxy que faz a terminação do TLS ou um serviço cujo listener TLS está em outra porta.
Uma porta STARTTLS foi tratada como TLS implícito
comumSMTP (25, 587), IMAP (143), POP3 (110), LDAP (389), PostgreSQL, MySQL e XMPP começam em texto claro e passam para TLS mediante solicitação; um handshake TLS direto lê a saudação deles como lixo.
Um proxy ou portal cativo responde em texto claro
ocasionalCom um cliente configurado com uma URL de proxy https:// para um proxy que só fala HTTP não criptografado, ou em redes que interceptam conexões, volta HTTP onde se esperava TLS.
Como corrigir
- 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.
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.
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
curl: (35) TLS connect error: error:0A00010B:SSL routines::wrong version numbercurl (OpenSSL backend)[SSL: WRONG_VERSION_NUMBER] wrong version numberPython ssl module (OpenSSL)code: 'ERR_SSL_WRONG_VERSION_NUMBER'Node.js tls.connect / fetch (undici)tls: first record does not look like a TLS handshakeGo crypto/tls