14

openssl で記述されたサーバーが SSL_accept を呼び出していない場合、クライアントの SSL_connect は永久にブロックされます。openssl -SSL_CTX_set_timeout 、 SSL_SESSION_set_timeout にはいくつかのタイムアウト関数がありますが、これらは SSL_connect には影響しません。

たとえば、ssl サーバーにバグがあり、SSL ハンドシェイクを行う前にループに陥った場合、SSL_connect のタイムアウトを設定する方法は本当にありませんか?

4

1 に答える 1

13

OpenSSL Libraryは、ソケット関連の問題の処理に関して最大​​限の柔軟性を提供します。SSL_connectブロッキングソケットで使用する必要があるため、ケース内のブロック。ノンブロッキングソケットで使用してください。その場合、-1で戻ります。tcp recvまたはsendがそれぞれ操作を完了できない場合に応じて、またはエラーが発生SSL_get_errorする関数を呼び出す場合。SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITE

SSL_ERROR_WANT_WRITE/を取得したら、ソケットを適切なタイムアウトSSL_ERROR_WANT_READに渡してselect関数を呼び出す必要があります。fd_set選択がタイムアウトした場合は、SSL_connectタイムアウトしたと見なすことができます。

注:SSL_SESSION_set_timeout、SSL再開にリンクされているセッションタイムアウト値を設定するために使用されます。それらは接続のタ​​イムアウトとは何の関係もありません。

以下のリンクが役立ちます(特に、多重化I / Oについて説明している2番目のリンクのセクション6)。

于 2012-08-08T10:30:09.923 に答える