Mensaje de error
SSL routines:tls_validate_record_header:wrong version number
También se muestra 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
OpenSSL 3.5 nombra la función tls_validate_record_header; OpenSSL 3.0, ssl3_get_record («error:0A00010B:SSL routines:ssl3_get_record:wrong version number»), y OpenSSL 1.1.1 usa el código antiguo 1408F10B. Las aplicaciones que formatean los errores sin el nombre de la función (curl, los mensajes de Node.js) imprimen «error:0A00010B:SSL routines::wrong version number». El prefijo anterior a «error:» es un identificador de hilo, y el sufijo, una ubicación en el código fuente; ambos varían.
OpenSSL 3 (openssl s_client and any OpenSSL-based client) — SSL_R_WRONG_VERSION_NUMBER
Qué significa
OpenSSL esperaba un registro TLS y comprobó el campo de versión del protocolo del encabezado, pero los bytes que recibió no son TLS en absoluto: normalmente es el comienzo de una respuesta HTTP o el saludo de texto de un servidor de correo, leído como si fuera un número de versión. El nombre induce a error: el otro extremo habla otro protocolo (o texto plano) en ese puerto, no una versión de TLS no admitida.
Por qué ocurre
El puerto sirve HTTP sin cifrar u otro protocolo sin cifrar
frecuenteHTTP en 80/8080, un backend detrás de un proxy que termina TLS o un servicio cuyo agente de escucha TLS está en otro puerto.
Se trató un puerto STARTTLS como TLS implícito
frecuenteSMTP (25, 587), IMAP (143), POP3 (110), LDAP (389), PostgreSQL, MySQL y XMPP empiezan en texto plano y pasan a TLS cuando se solicita; un handshake TLS directo lee su saludo como basura.
Un proxy o un portal cautivo responde en texto plano
ocasionalCon clientes configurados con una URL de proxy https:// para un proxy HTTP sin cifrar, o en redes que interceptan las conexiones, llega HTTP donde se esperaba TLS.
Cómo solucionarlo
- 1.
Usar -starttls con protocolos de actualización en banda
openssl s_client admite smtp, imap, pop3, ftp, xmpp, ldap, postgres, mysql y otros; con esta opción, el handshake TLS empieza después del comando de actualización del 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 qué envía realmente el puerto
Un banner de texto o una línea de estado HTTP en la salida de netcat demuestra que el puerto no es de 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.
Conectarse al puerto de TLS implícito
Usa el puerto TLS del protocolo cuando el cliente no admita 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
Errores 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