Zum Inhalt springen
ecdsa.com
curl (OpenSSL backend)curl

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

So behebst du den Fehler

  1. 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. 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. 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. 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

Gesamte Signaturfehler-Datenbank durchsuchen