2

openssl は、0.9.8m 以降のバージョンで安全な再ネゴシエーションを追加しました。このケースをどのように処理しますか? 非ブロッキングソケットを使用するサーバーで、SSL_acceptが行われたとします。サーバーは、ソケットが読み取り可能になるかどうかを確認します。その場合、クライアントが何らかの要求を送信したためにソケットが読み取り可能になったか、クライアントが接続を再ネゴシエートしたかの 2 つの可能性があります。SSL_MODE_AUTO_RETRY は、非ブロック ソケットについて理解しているため、適用できません。クライアントがリクエストを送信した場合、SSL_Read を呼び出す必要があります。クライアントが再ネゴシエートした場合、SSL_accept を呼び出す必要があります。クライアントが再ネゴシエーションを行ったときに SSL_read を呼び出すと、SSL_ERROR_SSL が返されます。では、SSL_accept または SSL_read を実行する必要があるかどうかを判断するにはどうすればよいでしょうか。SSL_read を再度呼び出すと、同じエラーが返されます。

ご意見ありがとうございます

4

1 に答える 1

0

Cを使用していると思います。エラーコードを確認し、最後にセッションの状態を維持する必要があります。ケースが success または needsRead または needsWrite の場合は、それぞれの関数を呼び出す必要があります。最初にステータスを needsAccept に設定します。受け入れ機能は、セッションに基づいて、読み取りまたは書き込みが必要かどうかを自動的に決定します。

 int retCode = SSL_get_error(ssl, retNum);
  switch (retCode) {
     case SSL_ERROR_NONE:
    return "success";
         case SSL_ERROR_WANT_READ:
    LOG_DEBUG("SSL_ERROR_WANT_READ");
    return "needsRead";

     case SSL_ERROR_WANT_WRITE:
    return "needsWrite";

    case SSL_ERROR_ZERO_RETURN:
    case SSL_ERROR_SSL:
    case SSL_ERROR_SYSCALL:
         return "socket should be closed";
}
于 2013-03-16T04:48:37.540 に答える