20

OpenSSl では、大部分の SSL_* 呼び出しのマニュアル ページは値 <= 0 を返すことでエラーを示し、SSL_get_error() を呼び出して拡張エラーを取得することを提案しています。

しかし、これらの呼び出しや他の OpenSSL ライブラリ呼び出しのマニュアル ページには、OpenSSL で「エラー キュー」を使用することへのあいまいな参照があります。これはSSL_get_errorのマニュアル ページの場合です。

   The current thread's error queue must be empty before the TLS/SSL I/O
   operation is attempted, or  SSL_get_error() will not work reliably.

そして、同じ man ページの SSL_ERROR_SSL の説明には、次のように書かれています。

   SSL_ERROR_SSL
       A failure in the SSL library occurred, usually a protocol error.
       The OpenSSL error queue contains more information on the error.

これは、エラー キューに読む価値のあるものがあることを意味します。また、読み取りに失敗すると、その後の SSL_get_error の呼び出しが信頼できなくなります。おそらく、make の呼び出しはERR_get_errorです。

コードでノンブロッキング ソケットを使用する予定です。そのため、エラー状態が SSL_ERROR_WANT_READ または SSL_ERROR_WANT_WRITE であることを確実に検出して、ソケットを正しいポーリング モードにすることが重要です。

だから私の質問はこれです:

  • SSL_get_error() は暗黙的に ERR_get_error() を呼び出しますか? または、両方を使用する必要がありますか?

  • すべての OpenSSL ライブラリ呼び出しの前にERR_clear_errorを呼び出す必要がありますか?

  • OpenSSL ライブラリの呼び出しが完了した後、キューに複数のエラーが発生する可能性はありますか? したがって、キュー内の最初のエラーが最後のエラーよりも関連性が高い状況はありますか?

4

1 に答える 1