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

Fehlermeldung

curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0

Auch ausgegeben als

  • curl: (56) OpenSSL SSL_read: OpenSSL/3.5.7: error:0A000126:SSL routines::unexpected eof while reading, errno 0

Neuere curl-Releases fügen nach „SSL_read: “ die Version der TLS-Bibliothek ein (zum Beispiel „OpenSSL/3.5.7: “). OpenSSL 1.1.1 hat diesen Zustand nicht so gemeldet; unter 1.1.1 erscheint dieselbe Kürzung meist als „curl: (18) transfer closed with N bytes remaining to read“.

curl (OpenSSL 3 backend) — CURLE_RECV_ERROR, SSL_R_UNEXPECTED_EOF_WHILE_READING

Was der Fehler bedeutet

Die TLS-Verbindung war aufgebaut und Daten flossen bereits, dann hat die Gegenstelle die TCP-Verbindung geschlossen, ohne vorher den TLS-Alert close_notify zu senden, während curl noch weitere Daten erwartete. OpenSSL 3 meldet ein solches abruptes Ende als Fehler statt als normales Ende des Datenstroms, weil ein fehlendes close_notify genau so aussieht wie ein Truncation-Angriff. curl meldet es als Empfangsfehler (Exit-Code 56).

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Herausfinden, welcher Hop die Verbindung schließt

    Notiere, wie viele Bytes übertragen werden und wie viele Sekunden bis zum Fehler vergehen, und wiederhole die Anfrage dann direkt gegen das Backend. Ein Abbruch nach einer runden Zahl von Sekunden deutet auf ein Timeout in einem Proxy oder Load Balancer hin.

    bash
    # How much arrived, and for how long, before the connection died?
    curl -sv --trace-time https://api.example.com/export.csv -o out.csv 2>&1 | tail -20
    # Same request directly to the backend, bypassing the proxy / load balancer
    curl -sv --resolve api.example.com:443:10.0.0.12 https://api.example.com/export.csv -o out.csv
  2. 2.

    Auslösendes Timeout erhöhen

    Erhöhe das Limit in der Komponente, die die Verbindung kappt, über die längste legitime Antwortzeit hinaus, oder sorge dafür, dass der langsame Endpunkt schneller antwortet (große Exporte streamen oder paginieren).

    text
    # nginx in front of a slow upstream (both default to 60s)
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
    # Load balancers: set the idle timeout above the longest legitimate response time
  3. 3.

    Idempotente Übertragungen wiederholen

    Lass curl Downloads über unzuverlässige Leitungen wiederholen und fortsetzen. Das behandelt das Symptom auf dem Client, während die Serverseite untersucht wird.

    bash
    # For idempotent downloads: retry, and resume where the transfer stopped
    curl --retry 5 --retry-all-errors -C - -o big.iso https://downloads.example.com/big.iso
  4. 4.

    Servercode: TLS-Verbindungen sauber schließen

    Sende close_notify, bevor du den Socket schließt (SSL_shutdown in OpenSSL, unwrap() in Python, Close() auf einer tls.Conn in Go), und begrenze HTTP-Bodys mit Content-Length oder Chunked Encoding, damit ein sauberes Ende eindeutig erkennbar ist.

    python
    # Server code: shut TLS down cleanly so the peer receives close_notify
    conn.unwrap()   # Python ssl.SSLSocket: sends close_notify before closing
    conn.close()

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen