エラーメッセージ
error:0A000126:SSL routines::unexpected eof while reading
別の表記
- SSL routines::unexpected eof while reading
openssl CLI は「<thread id>:error:0A000126:SSL routines::unexpected eof while reading:<source>」と出力します。curl はこれを「curl: (56) OpenSSL SSL_read: … unexpected eof while reading, errno 0」として、Python は「[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)
このエラーの意味
OpenSSL がまだデータを待っている間に(ハンドシェイク中またはストリームの途中で)、ピアが TLS の close_notify アラートを先に送らずに TCP 接続を閉じました。通知なしの切断は、攻撃者がストリームを切り詰めた場合と区別できないため、OpenSSL 3 はこれをエラーとして報告します。OpenSSL 1.1.1 では、システムコールのエラー経路を通じてしか報告されませんでした。
発生する理由
サーバーが接続を拒否または切断した
よくある受け入れられないハンドシェイク(不明な SNI、共通のバージョンがない)をアラートを送らずに閉じるサーバーや、応答の途中でクラッシュまたはタイムアウトするサーバーが該当します。
ファイアウォール、プロキシ、ロードバランサーが接続を切断した
よくあるアイドルタイムアウト、接続数の制限、TLS をフィルタリングするファイアウォールは、TLS のシャットダウンを行わずに TCP 接続を終了させます。
close_notify を送信しない古いピア
ときどき一部の組み込みサーバーや古い実装は、レスポンスのたびに TLS のシャットダウンを行わずにソケットを閉じます。OpenSSL 3 では、そうしたレスポンスがすべてこのエラーで終わります。
修正方法
- 1.
接続がいつ終わるかを確認する
証明書が表示される前にエラーが出る場合は、サーバーまたはネットワークがハンドシェイクを拒否しています。データの後に出る場合は、ピアまたはミドルボックスがストリームを切断しています。
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.
管理下にある古いピア:SSL_OP_IGNORE_UNEXPECTED_EOF
OpenSSL 3 では、通知なしの切断を通常のストリームの終わりとして扱えます。このオプションは切り詰めの検出を無効にするため、プロトコル自体が切り詰めを検出できる(たとえば Content-Length)特定の古いピアに限って使ってください。
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.
ピアを修正する:TLS を正しくシャットダウンする
接続を閉じる前に close_notify を送信すれば、すべてのクライアントでこのエラーが解消されます。
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.
関連するエラー
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)