1

これは、クライアントサーバー通信でのopenssl再ネゴシエーションの問題に関するものです。opensslバージョンは1.0.1cです。

クライアントとサーバーはブロッキングソケットを使用してSSL接続を確立しており、通信は正常です。クライアントはデータを送信し、サーバーは受信してクライアントに送り返します。

サーバーが再ネゴシエーションを実行する場合は、SSL_renogotiate、SSL_do_handshakeを使用して実行され、その後、SSL状態をSSL_ST_ACCEPTに設定します。

クライアント側の一般的な動作は、コンソールがSSL_writeを使用してデータを読み取り、サーバーに送信するのを待機しています。この間、サーバーが再ネゴシエートし、クライアント側がSSL_writeを呼び出してコンソールからデータを送信すると、再ハンドシェイクは失敗します。

次の行がサーバー側で出力され、2番目のSSL_do_handshakeから-1が返されます。

3086063264:エラー:140940F5:SSLルーチン:SSL3_READ_BYTES:予期しないレコード:s3_pkt.c:1404:

次の行は、サーバーにデータを送信した後に-1を返すSSL_readを使用して読み取るときに、クライアント側で出力されます。

3086079648:エラー:140943F2:SSLルーチン:SSL3_READ_BYTES:sslv3アラート予期しないメッセージ:s3_pkt.c:1251:SSLアラート番号10 3086079648:エラー:140940E5:SSLルーチン:SSL3_READ_BYTES:sslハンドシェイクの失敗:s3_pkt.c:1151:

ソケットをブロックするためのopenssl.orgには、次の情報が記載されています。

基盤となるBIOがブロックしている場合、SSL_write()は、書き込み操作が終了するかエラーが発生した場合にのみ返されます。ただし、再ネゴシエーションが発生した場合は、SSL_ERROR_WANT_READが発生する可能性があります。

SSL再ネゴシエーションを受信したときのSSL_writeがクリント側でどの程度正確に動作するか。この場合、どのようにして再ハンドシェイクを成功させることができますか。

よろしく、プラディープ

4

1 に答える 1