OpenSSL および/または SSL/TLS プロトコルは、無限の再ネゴシエーションに対する何らかの組み込みの保護を提供しますか?
特に、SSL_read()
リモート側が (おそらく悪意を持って) ペイロード データを送信せずに再ネゴシエーションを要求し続けるため、 が永久に実行し続けることは可能ですか?
ポーリングメカニズムを使用して単一のスレッドから多数の SSL 接続を処理し、1 つの接続での I/O の処理が I/O の枯渇につながらない形式の公平性を確保したいため、これについて心配しています。他の接続。
非ブロッキング モードのソケットでregular を呼び出すとread()
、バッファーが最終的にいっぱいになるため、永久に実行し続けることができないことがわかります。
ただし、SSL_read()
再ネゴシエーションを透過的に処理できるため、リモート側が (おそらく悪意を持って) ペイロード データを送信せずに再ネゴシエーションを要求し続け、基になるトランスポート層が基になる読み取りと書き込みEWOULDBLOCK
がSSL_read()
.永久に実行されることになり、それによって他の接続が不足します。
したがって、私の質問: OpenSSL またはプロトコルには、それを回避するメカニズムがありますか? ちなみに、質問は同様に適用さSSL_write()
れます。
編集:たとえば、基礎となる読み取り/書き込み操作が決して失敗しない場合でも、複数の再ネゴシエーションに従事する前に/指示SSL_read()
で戻ることを確認できますか?SSL_ERROR_WANT_READ
SSL_ERROR_WANT_WRITE
EWOULDBLOCK
編集: この質問の目的のために、通常のソケット BIO ( BIO_s_socket()
) を使用しており、基になるソケットが非ブロック モードであると仮定します。