Fehlermeldung
SSL routines:tls_validate_record_header:wrong version number
Auch ausgegeben als
- 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 nennt die Funktion tls_validate_record_header, OpenSSL 3.0 ssl3_get_record („error:0A00010B:SSL routines:ssl3_get_record:wrong version number“), OpenSSL 1.1.1 verwendet den älteren Code 1408F10B. Anwendungen, die Fehler ohne den Funktionsnamen formatieren (curl, Meldungen von Node.js), geben „error:0A00010B:SSL routines::wrong version number“ aus. Das Präfix vor „error:“ ist eine Thread-ID und das Suffix eine Position im Quellcode; beide variieren.
OpenSSL 3 (openssl s_client and any OpenSSL-based client) — SSL_R_WRONG_VERSION_NUMBER
Was der Fehler bedeutet
OpenSSL hat einen TLS-Record erwartet und das Feld für die Protokollversion im Header geprüft, aber die empfangenen Bytes sind überhaupt kein TLS – meist der Anfang einer HTTP-Antwort oder die Textbegrüßung eines Mailservers, als Versionsnummer gelesen. Der Name führt in die Irre: Die Gegenstelle spricht auf diesem Port ein anderes Protokoll (oder Klartext), keine nicht unterstützte TLS-Version.
Warum der Fehler auftritt
Auf dem Port läuft reines HTTP oder ein anderes Klartextprotokoll
häufigHTTP auf 80/8080, ein Backend hinter einem Proxy, der TLS terminiert, oder ein Dienst, dessen TLS-Listener auf einem anderen Port liegt.
Ein STARTTLS-Port wurde wie implizites TLS behandelt
häufigSMTP (25, 587), IMAP (143), POP3 (110), LDAP (389), PostgreSQL, MySQL und XMPP beginnen im Klartext und wechseln auf Anfrage zu TLS; ein direkter TLS-Handshake liest ihre Begrüßung als Datenmüll.
Ein Proxy oder Captive Portal antwortet im Klartext
gelegentlichClients, die für einen reinen HTTP-Proxy mit einer Proxy-URL https:// konfiguriert sind, oder Netzwerke, die Verbindungen abfangen: In beiden Fällen kommt HTTP zurück, wo TLS erwartet wurde.
So behebst du den Fehler
- 1.
-starttls für Protokolle mit In-Band-Upgrade verwenden
openssl s_client unterstützt smtp, imap, pop3, ftp, xmpp, ldap, postgres, mysql und weitere; damit beginnt der TLS-Handshake erst nach dem Upgrade-Befehl des Protokolls.
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.
Nachsehen, was der Port tatsächlich sendet
Zeigt netcat ein Textbanner oder eine HTTP-Statuszeile, spricht der Port kein implizites TLS.
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.
Mit dem Port für implizites TLS verbinden
Verwende den TLS-Port des Protokolls, wenn der Client kein STARTTLS beherrscht.
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
Verwandte Fehler
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