Message d’erreur
error:0A000126:SSL routines::unexpected eof while reading
Également affiché sous la forme
- SSL routines::unexpected eof while reading
La CLI openssl affiche « <thread id>:error:0A000126:SSL routines::unexpected eof while reading:<source> » ; curl l’enveloppe sous la forme « curl: (56) OpenSSL SSL_read: … unexpected eof while reading, errno 0 », Python sous la forme « [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol ».
OpenSSL 3 — SSL_R_UNEXPECTED_EOF_WHILE_READING (peer closed the TCP connection without close_notify)
Ce que cela signifie
Le pair a fermé la connexion TCP sans envoyer d’abord l’alerte TLS close_notify, alors qu’OpenSSL attendait encore des données (pendant le handshake ou en plein flux). OpenSSL 3 signale cette situation comme une erreur, car une fermeture silencieuse est impossible à distinguer d’un attaquant qui tronque le flux ; OpenSSL 1.1.1 ne la signalait que par le chemin d’erreur des appels système.
Pourquoi cela se produit
Le serveur a refusé ou abandonné la connexion
fréquenteDes serveurs qui ferment les handshakes qui ne leur conviennent pas (SNI inconnu, aucune version commune) au lieu d’envoyer une alerte, ou qui plantent ou dépassent leur délai en pleine réponse.
Un pare-feu, un proxy ou un répartiteur de charge a coupé la connexion
fréquenteLes délais d’inactivité, les limites de connexions et les pare-feu qui filtrent TLS mettent fin aux connexions TCP sans fermeture TLS.
Un pair ancien qui n’envoie jamais close_notify
occasionnelleCertains serveurs embarqués et d’anciennes implémentations ferment le socket après chaque réponse sans fermeture TLS ; avec OpenSSL 3, chacune de ces réponses se termine par cette erreur.
Comment corriger l’erreur
- 1.
Déterminer à quel moment la connexion se termine
Si l’erreur apparaît avant qu’aucun certificat ne soit affiché, le serveur ou le réseau a refusé le handshake ; si elle apparaît après des données, le pair ou un équipement intermédiaire a coupé le flux.
bash # During the handshake (no certificate printed) -> the server or network refused the connection # After data was exchanged -> the peer stopped mid-stream echo | openssl s_client -connect api.example.com:443 -servername api.example.com -state 2>&1 | grep -E 'SSL_connect|error' - 2.
Pairs anciens que vous contrôlez : SSL_OP_IGNORE_UNEXPECTED_EOF
OpenSSL 3 peut traiter une fermeture silencieuse comme une fin de flux normale. N’utilisez cette option que pour des pairs anciens précis dont le protocole détecte lui-même la troncature (par exemple Content-Length), car elle désactive la détection de troncature.
python # Only for peers you control that close without close_notify (legacy embedded servers): # OpenSSL 3 option SSL_OP_IGNORE_UNEXPECTED_EOF, exposed by Python 3.10+ as ssl.OP_IGNORE_UNEXPECTED_EOF import ssl ctx = ssl.create_default_context() ctx.options |= ssl.OP_IGNORE_UNEXPECTED_EOF # truncation is then no longer detected - 3.
Corriger le pair : fermer TLS proprement
Envoyer close_notify avant de fermer la connexion supprime l’erreur pour tous les clients.
text Server code: call SSL_shutdown() (or the library's close/unwrap) before closing the socket, and delimit HTTP responses with Content-Length or chunked encoding.
Erreurs associées
curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while…curl (OpenSSL 3 backend)[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocolPython ssl module (OpenSSL)Client network socket disconnected before secure TLS connection was establishedNode.js tls / https / fetchGnuTLS recv error (-110): The TLS connection was non-properly terminated.git over HTTPS with libcurl-gnutls (Debian, Ubuntu)