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
Der Serverprozess ist mitten in der Antwort abgestürzt oder in ein Timeout gelaufen
häufigEin Anwendungs-Worker, der wegen eines Timeouts oder Speichermangels beendet wurde, ein Neustart von PHP-FPM- oder Gunicorn-Workern oder ein Upstream, der aufgegeben hat, schließt den Socket, während der Body der Antwort noch gesendet wird.
Eine Middlebox hat die Verbindung getrennt
häufigFirewalls, NAT-Gateways, Firmen-Proxys und Load Balancer, die Limits für Leerlaufzeit oder maximale Dauer durchsetzen, können einen langen Download oder eine langsame Antwort auf TCP-Ebene abbrechen, ohne dass der Server TLS ordnungsgemäß beendet.
Der Server beendet Antworten ohne close_notify
gelegentlichManche eingebetteten Webserver, alte IIS-Versionen und selbst geschriebene TLS-Server schließen den Socket ohne TLS-Shutdown. Bei HTTP-Antworten, deren Ende durch das Schließen der Verbindung markiert wird, melden Clients mit OpenSSL 3 jede solche Antwort mit diesem Fehler.
Ein Größenlimit für den Body hat die Übertragung abgebrochen
gelegentlichUpload-Limits (client_max_body_size, WAF-Regeln) oder Download-Kontingente setzen die Verbindung manchmal zurück, statt eine korrekte 413- oder 403-Antwort zu liefern.
So behebst du den Fehler
- 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.
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.
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.
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
error:0A000126:SSL routines::unexpected eof while readingOpenSSL 3[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocolPython ssl module (OpenSSL)GnuTLS recv error (-110): The TLS connection was non-properly terminated.git over HTTPS with libcurl-gnutls (Debian, Ubuntu)curl: (35) TLS connect error: error:0A00010B:SSL routines::wrong version numbercurl (OpenSSL backend)