私はopenSSLを初めて使用し、非ブロッキングソケット、およびメモリBIOと組み合わせてlibevent、libev、libuvなどのライブラリを使用するときにhttps接続を作成することが最善/良い解決策であることを理解しようとしています。
openSSL 呼び出し/データとアプリケーション データを管理する方法を理解しようとしています。要するに、ssl クライアント アプリケーションがどのように機能するかについての私の理解は、次のようなものです。
- SSL_CTX を作成する
- 新しいソケット接続を作成します (例: libuv を使用しています)
- 2 つのメモリ BIO を作成します。
- 1つはサーバーから受け取ったデータで満たされています(readBio)
- もう 1 つは、読み取り元のアプリケーション コードで使用されます。(書き込みバイオ)
- SSL* を作成し、状態を SSL_connect_state に設定します
- SSL_do_handshake でハンドシェイク プロセスを開始します。
- [ループ] データの送受信
私は libuv を使用しているため (ただし、これは他の非同期/非ブロック ライブラリである可能性があります)、ソケットでデータを受信したときに呼び出される読み取りコールバックがあります。ソケットに書き込む必要があるデータがある場合、このデータをライブラリの書き込み
関数 ( this 内uv_write()
) に渡しますが、その間に SSL への呼び出しを配置する必要があります。
したがって、SSL_do_handshake(...) を呼び出した後、SSL はいくつかのデータを writeBIO に格納します。これを読み取ってソケットに渡す必要があります。私が考えていた 1 つの質問は、SSL がデータをこの BIO に保存することをどのように知ることができるか、そして次に、これをいつソケット経由で送信する必要があるかをどのように知ることができるかということです。
いくつかのコードを調べた後、SSL_do_handshake() を呼び出した後に writeBIO から消費する必要があることがわかりました。しかし、次のステップは私には明確ではありません。ハンドシェイクからの最初のバイトを終了した後、libuv の「イベント」ループがすべてを開始します。新しいデータがソケットに到着すると、'onread()
コールバックが呼び出されます。しかし、この着信データをどのように処理すればよいでしょうか? (たとえば、SSL状態を自分で保持しますか(<--しないようにアドバイスされている人もいます))。
ブロッキング ソケットとコア SSL 関数を使用して接続を確立する例をたくさん見てきましたが、メモリ BIO をクライアントとして使用する方法を示すクリーンで最小限の例は見つかりませんでした。
openSSL をテストするために使用しているコードをここに貼り付けました: https://gist.github.com/3989091
SSL で非同期/非ブロッキング ソケットとメモリ BIO を使用するプロセスを説明できる人はいますか?
ありがとうR