5

私は(CPPで)HTTPを介して独自のプロトコルを開発し、それを使用してサーバーと通信しました。ここで、データ自体を転送するために、独自のプロトコルを介してSSL接続を確立したいと思います。

OpenSSLを使用してそれを行うことはできますか?Webを検索したところ、BIOに関連するものしか見つかりませんでしたが、自分のニーズに合わせて使用​​する方法がわかりませんでした。

とにかく、私にとって最善の解決策は、OpenSSLに独自の送信および受信機能を渡して、すべての通信自体が私の機能のみを経由するようにする方法です。

先のTNX:)

4

2 に答える 2

12

BIOペアを使用します。ssltest.cプログラムで例を見つけることができ、ソースでを検索しbio_pairます。基本的な考え方は、OpenSSLエンジンをブラックボックスとして扱うことです。

あなたのコードがしなければならない4つのことがあります:

  1. 反対側への接続を介して暗号化されたデータを受信する場合は、SSLエンジンの暗号化されたBIOに書き込む必要があります。

  2. SSLエンジンが暗号化されたデータを反対側に送信する場合は、SSLエンジンの暗号化されたBIOからデータを読み取り、反対側に転送する必要があります。

  3. 暗号化して送信するプレーンテキストがある場合は、SSLエンジンのプレーンテキストBIOに書き込む必要があります。

  4. SSLエンジンに復号化されたプレーンテキストがある場合は、SSLエンジンのプレーンテキストBIOから読み取る必要があります。

OpenSSLは、SSLプロトコルに従い、2つのBIO間でデータを移動するエンジンとして純粋に機能します。これらの4つのデータストリームすべてを動かし続ける限り、すべてのプロトコルネゴシエーションと操作を実行します。

私があなたに与えることができる1つの注意はこれです-これらのものの間に特別な関係を仮定しないでください。たとえば、暗号化して送信したいプレーンテキストがあり、それをSSLエンジンのプレーンテキストBIOに書き込む場合、SSLエンジンは、反対側から暗号化されたデータを受信するまで先に進むことができない場合があります。SSLエンジンをブラックボックスとして扱い、可能な限りこれら4つのことをすべて実行します。SSLエンジンを「調べ」ようとしないでください。たとえば、SSLエンジンに暗号化されたデータを渡したため、必然的にプレーンテキストが含まれることを期待してください。可能性はありますが、暗号化されたデータを反対側に送信する必要がある場合もあります。

もう1つの注意:SSLエンジンには1つの状態しかありません。読み取り状態と書き込み状態はありません。(醜い詳細が必要な場合は、このスレッドで「悪夢のシナリオ」を検索してください。)複数のスレッドでSSL接続を使用し、TCP接続(読み取りと書き込み)と同じように動作することを期待している場合、これはあなたを噛む可能性が最も高いです。致命的なエラーまたは接続のクローズの場合を除いて、サイドは独立しています)。

于 2013-02-04T11:32:48.090 に答える
0

2番目のオプション-独自のメッセージを持ち、HTTPを使用してクライアントとサーバー間でメッセージを渡すプロトコル。

HTTPを使用して独自のメッセージを渡す場合、SSL / TLSにOpenSSLを使用すると、独自のHTTPライブラリライブラリも作成する必要があることを意味します。

代わりに、OpenSSL経由かどうかに関係なく、HTTPSをサポートするHTTPライブラリを使用してください(ほとんどの場合サポートしています)。HTTPS上でカスタムメッセージを交換することは、かなり透過的であり、プレーンHTTPを使用する場合と同様である必要があります。HTTPSを通常どおりに構成する必要があります。

于 2013-02-05T10:07:11.323 に答える