Message d’erreur
SSL routines:tls_validate_record_header:wrong version number
Également affiché sous la forme
- 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 nomme la fonction tls_validate_record_header, OpenSSL 3.0 ssl3_get_record (« error:0A00010B:SSL routines:ssl3_get_record:wrong version number »), et OpenSSL 1.1.1 utilise l’ancien code 1408F10B. Les applications qui formatent les erreurs sans le nom de la fonction (curl, messages de Node.js) affichent « error:0A00010B:SSL routines::wrong version number ». Le préfixe avant « error: » est un identifiant de thread et le suffixe un emplacement dans le code source ; tous deux varient.
OpenSSL 3 (openssl s_client and any OpenSSL-based client) — SSL_R_WRONG_VERSION_NUMBER
Ce que cela signifie
OpenSSL attendait un enregistrement TLS et a contrôlé le champ de version du protocole de l’en-tête, mais les octets reçus ne sont pas du TLS du tout : généralement le début d’une réponse HTTP ou le message d’accueil textuel d’un serveur de messagerie, lu comme s’il s’agissait d’un numéro de version. Le nom de l’erreur est trompeur : le pair parle un autre protocole (ou du texte en clair) sur ce port, il ne s’agit pas d’une version de TLS non prise en charge.
Pourquoi cela se produit
Le port sert du HTTP en clair ou un autre protocole en clair
fréquenteDu HTTP sur 80/8080, un backend derrière un proxy qui termine TLS, ou un service dont l’écouteur TLS se trouve sur un autre port.
Un port STARTTLS a été traité comme du TLS implicite
fréquenteSMTP (25, 587), IMAP (143), POP3 (110), LDAP (389), PostgreSQL, MySQL et XMPP commencent en clair et passent à TLS sur demande ; un handshake TLS direct interprète leur message d’accueil comme des données incohérentes.
Un proxy ou un portail captif répond en clair
occasionnelleAvec des clients configurés avec une URL de proxy en https:// pour un proxy HTTP en clair, ou sur des réseaux qui interceptent les connexions, c’est du HTTP qui revient là où TLS était attendu.
Comment corriger l’erreur
- 1.
Utiliser -starttls pour les protocoles qui passent à TLS en cours de connexion
L’option -starttls d’openssl s_client prend en charge smtp, imap, pop3, ftp, xmpp, ldap, postgres, mysql et d’autres protocoles ; avec elle, le handshake TLS commence après la commande de passage à TLS propre au protocole.
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.
Regarder ce que le port envoie réellement
Une bannière texte ou une ligne d’état HTTP obtenue avec netcat montre que le port n’utilise pas TLS implicite.
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.
Se connecter au port TLS implicite
Utilisez le port TLS du protocole lorsque le client ne prend pas en charge 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
Erreurs associées
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