Fehlermeldung
curl: (35) TLS connect error: error:0A00010B:SSL routines::wrong version number
Auch ausgegeben als
- curl: (35) error:0A00010B:SSL routines::wrong version number
- curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
Neuere curl-Releases (hier 8.14.1) stellen dem OpenSSL-Grund „TLS connect error: “ voran; curl 7.x gab den Grund allein aus. Builds mit OpenSSL 1.1.1 geben die lange Form „error:1408F10B:SSL routines:ssl3_get_record:wrong version number“ aus; OpenSSL 3.x gibt „error:0A00010B:SSL routines::wrong version number“ aus.
curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, SSL_R_WRONG_VERSION_NUMBER
Was der Fehler bedeutet
curl hat ein TLS-ClientHello gesendet, und die ersten zurückgekommenen Bytes waren kein TLS-Record. OpenSSL liest aus dieser Antwort das Versionsfeld des Record-Headers und findet Datenmüll, typischerweise die Buchstaben von „HTTP/1.1 400“ eines reinen HTTP-Servers. Trotz des Wortlauts geht es fast nie um TLS-Versionen: Die Gegenseite spricht auf diesem Port kein TLS.
Warum der Fehler auftritt
https:// auf einem Port, auf dem reines HTTP läuft
häufigEntwicklungsserver auf 8080 oder 3000, ein Backend hinter einem Load Balancer oder eine falsch konfigurierte listen-Direktive antworten mit HTTP. Ein Vertauschen von http und https in der URL oder die TLS-Portnummer zusammen mit http:// ist die häufigste Ursache dieser Meldung.
Die Proxy-URL beginnt mit https://, aber der Proxy spricht HTTP
häufigMit HTTPS_PROXY=https://proxy:3128 startet curl TLS direkt mit dem Proxy. Die meisten Forward-Proxys erwarten vom Client reines HTTP und öffnen einen verschlüsselten CONNECT-Tunnel zum Ziel, daher sollte die Proxy-URL auch für HTTPS-Traffic mit http:// beginnen.
Implizites TLS gegen einen STARTTLS-Port
gelegentlichSMTP auf 25/587, IMAP auf 143, POP3 auf 110, LDAP auf 389 sowie PostgreSQL/MySQL senden ihre Begrüßung im Klartext und wechseln erst später zu TLS. Ein TLS-Handshake gleich zu Beginn scheitert dort sofort.
Ein Captive Portal oder Filter antwortet statt des Servers
gelegentlichWLANs in Hotels und an Flughäfen, Jugendschutzfilter und manche Firewalls fangen Port 443 ab und antworten mit einer HTTP-Weiterleitungsseite, bevor überhaupt TLS stattfindet.
So behebst du den Fehler
- 1.
Prüfen, welches Protokoll der Port tatsächlich spricht
Rufe denselben Port mit http:// auf. Bekommst du eine HTTP-Antwort, verwende entweder http:// oder den richtigen TLS-Port; openssl s_client bestätigt, auf welchen Ports ein TLS-Handshake zustande kommt.
bash # What does the port speak? An HTTP status line means plain HTTP. curl -sS -i http://api.example.com:8080/ | head -1 # HTTP/1.1 200 OK -> not TLS openssl s_client -connect api.example.com:8443 -brief </dev/null # handshake summary -> TLS - 2.
Für die Proxy-URL http:// verwenden
Sofern dein Proxy TLS zum Proxy nicht ausdrücklich unterstützt, gib den Proxy als http://host:port an. Die Verbindung zum Ziel bleibt trotzdem Ende-zu-Ende-TLS durch den CONNECT-Tunnel.
bash # Most corporate proxies accept plain HTTP from the client and tunnel HTTPS with CONNECT export HTTPS_PROXY=http://proxy.example.net:3128 # http:// even for HTTPS traffic curl -x http://proxy.example.net:3128 https://api.example.com/ - 3.
Auf STARTTLS-Ports STARTTLS verwenden
Bei Mail-Protokollen wechselt curl mit --ssl-reqd auf den Submission- und IMAP-Ports zu TLS oder nutzt mit den Schemata smtps:// und imaps:// implizites TLS auf 465 und 993.
bash # Port 587/25 (SMTP) and 143 (IMAP) start in plain text and upgrade with STARTTLS curl --ssl-reqd smtp://mail.example.com:587 -v # Implicit TLS lives on 465 (SMTPS) and 993 (IMAPS) curl smtps://mail.example.com:465 -v - 4.
Eigener Server: TLS auf dem Listener aktivieren
Sollen Clients auf diesem Port https:// verwenden, braucht der Listener aktiviertes TLS und ein konfiguriertes Zertifikat; andernfalls veröffentliche den richtigen Port.
text # nginx: the port that clients reach with https:// needs the ssl flag server { listen 443 ssl; ssl_certificate /etc/nginx/tls/fullchain.pem; ssl_certificate_key /etc/nginx/tls/privkey.pem; }
Verwandte Fehler
SSL routines:tls_validate_record_header:wrong version numberOpenSSL 3 (openssl s_client and any OpenSSL-based client)code: 'ERR_SSL_WRONG_VERSION_NUMBER'Node.js tls.connect / fetch (undici)[SSL: WRONG_VERSION_NUMBER] wrong version numberPython ssl module (OpenSSL)http: server gave HTTP response to HTTPS clientGo net/httpjavax.net.ssl.SSLException: Unsupported or unrecognized SSL messageJava (JSSE)