6

OpenSSL API を使用して 1 つの SSL サーバーと対話する 1 つの SSL クライアントを作成しました。OpenSSL サイトで、データを書き込んだ後に書き込みバッファをフラッシュする必要があることを知りました。クライアント プログラムで SSL_Write と SSL_Read を使用しています。OpenSSL サイトが示唆したように、BIO_flush(BIO*) を使用してデータをフラッシュしようとしたところ、ここでクラッシュしました。

このサイトから取得した SSL ライブラリを使用しています

ここで、BIO_flush が読み取りバッファーをフラッシュするのか、書き込みバッファーをフラッシュするのかについては明確ではありません..:-(だから、SSL 書き込みバッファーをフラッシュする他の方法があることを知りたかっただけです...?

これが私のクライアントプログラムの詳細です。

  1. SSL_new を使用して SSL オブジェクト (mSsl) を作成する
  2. TCPソケットの作成とサーバーとの接続
  3. BIO_new_socket(socket_id,BIO_NOCLOSE)を使用してBIOオブジェクト(mBio)を作成する
  4. SSL_set_bio(mSsl,mBio,mBio); を使用して BIO オブジェクトを SSL オブジェクトに設定します。
  5. SSL_set_fd(mSsl,socket_id); を使用してソケットを SSL オブジェクトに設定します。
  6. SSL_Connect(mSsl) を使用してサーバーとの SSL 接続を確立します。

上記の手順の後、書き込み用と読み取り用に 2 つの別々のスレッドを開始しています。書き込みスレッドは SSL_write を使用してデータをサーバーに書き込み、読み取りスレッドは SSL_Read を使用してサーバーからデータを読み取ります。

SSL_Write を使用して各パケットを書き込んだ後の書き込みスレッドでは、BIO_flush(mBio) を呼び出しています。

プログラム全体で、バイオバッファフラッシュを行うために、この場所でのみ mBio オブジェクトを直接使用しています。

いくつかのパケットの送信を開始すると、BIO_flush でクラッシュするようにプログラムします... それ以上のものは得られません。

上記のリンクを提供し、同じ問題に直面しているライブラリを使用した人はいますか? はいの場合、解決策を知っているかどうか教えてください。

BIO_flush() を使用するスレッド同期規則はありますか? つまり、BIO_flush SSL_Read の呼び出しが同時に発生してはならないということです... ?

4

2 に答える 2

9

書き込み後に書き込みバッファをフラッシュする必要があることをどこで知りましたか?

フラッシュ関数も探していましたが、見つかりませんでした。

SSL_write を呼び出すたびに、少なくとも 1 つの SSL レコードが生成され、それがソケットに出力されます。ソケットでは、nagle アルゴリズムがそれをカーネルに一時的にバッファリングし、すぐに外部に送信します。

したがって、SSL_write にはバッファリングがないため、フラッシュはありません!

私はむしろフラッシュ機能を持ち、すべての SSL レコードをいっぱいにしたいのですが、私が見る限り、それは利用できません。私は今、独自のバッファリングを行い、可能な限り大きな SSL_write 呼び出しを行う予定です。

ところで: ちょっとしたテスト プログラムを書いたところです。1 回の書き込みでバッファを送信し、もう一度実行して、文字ごとに SSL_write を呼び出しました。どちらの場合も tcpdump を実行し、Wireshark では、最初の実行では大きなアプリケーション データ レコードがほとんどなく、2 回目の実行では小さなレコードが多数含まれていることがわかりました。それで確定だと思います。

于 2014-01-03T10:33:17.970 に答える
2

BIO_flush は、書き込みデータをフラッシュするために使用されます。

BIO 構造は SSL_read/write 呼び出しを認識しないため、BIO_flush と SSL_read/write の組み合わせには問題があります。

BIO_read/write を使用すると、より良い結果が得られます。

絶対に SSL_read/write を使用する必要がある場合は、BIO の使用を避ける必要があります。

この OpenSSL ドキュメントの最後にある例で、さらに理解を深めることができると思います。

簡単な OpenSSL クライアントの例

その例を試してもまだクラッシュする場合は、使用している特定のライブラリ ビルドに問題がある可能性があります。

于 2013-06-18T14:20:45.663 に答える