2009-07-09 19 views
12

ここに私の質問です。 (Visual Studioの9、Qtの4.5)WindowsのC++クライアントアプリケーションと通信既存のTCP&UDPコードにSSLサポートを追加しますか?

を追加する非常に最も簡単な方法は何ですか -

は、今私は(GCC C++を使用して書かれた)Linuxサーバのアプリケーションを持っています既存のプロトコルを完全に犠牲にすることなく、通信を保護するためにSSLの両側をサポートしますか?

これは、UDPとTCPの組み合わせを使用して接続を初期設定し、ポートトンネリング処理を行い、ストリーミングデータにUDPを使用するVOIPアプリケーションです。

私は過去にこの問題を解決するために必要だったセキュリティ証明書を最初から作成することで多くの問題を抱えてきました。

既存の作業サンプルコードが理想的です。

ありがとうございました!

答えて

11

SSL is very complexですので、ライブラリを使いたいと思っています。

などKeyczarBotancryptlib、などいくつかのオプションは、一人ひとりこれらのライブラリ(または、そのようなBoost.AsioやOpenSSLのよう他の人によって提案されたライブラリ)の一つが、このためのサンプルコードがありますがあります。


(どのようにあまりにも多くの痛みを引き起こすことなく、既存のコードにライブラリを統合するために)あなたの2番目の質問に答える:あなたの現在のコードに依存するようになるだろう。 intstringsなどを送信/受信するWinsockまたはソケットメソッドを呼び出す単純な関数をすでに持っている場合は、それらの関数の中身を書き直すだけで済みます。そして、もちろん、ソケットを設定するコードを変更してください。

一方、Winsock /ソケット関数を直接呼び出す場合は、同様のセマンティクスを持つ関数を作成し、データを暗号化して送信し、Winsock呼び出しをそれらの関数に置き換えることができます。

ただし、Google Protocol BuffersまたはApache Thrift(a.k.a Facebook Thrift)に切り替えることを検討してください。 Googleのプロトコルバッファーのドキュメントには、「プロトコルバッファーの前には、要求と応答のハンドマーシャリング/アンマーシャリングを使用し、プロトコルのいくつかのバージョンをサポートしていた要求と応答の形式があり、非常に醜いコードになりました。 ... "

現在、マーシャリング/アンマーシャリングフェーズに入っています。それは働くことができます、実際に私が取り組んでいるプロジェクトはこのメソッドを使用します。しかし、それを図書館に残すことはずっと良かったです。特に将来的にソフトウェアを更新することを考えている図書館があります。

このルートを使用すると、SSLライブラリを使用してネットワーク接続をセットアップし、その接続でThrift/Protocol Bufferデータをプッシュします。それでおしまい。これには広範なリファクタリングが必要ですが、最終的には保守するコードが少なくなります。私が言及したプロジェクトのコードベースにプロトコルバッファを導入したとき、マーシャル/デマーシャリングコードの約300行を取り除くことができました。

+0

こんにちは、マックス、 を

彼らは同様にあなたの既存のコードにCyaSSLを追加することに触れSSLチュートリアルを持っています詳細をお寄せいただきありがとうございます。 (おそらく私の元の質問には明確な言葉が書かれていなかったかもしれない)あなたの答えは、私のクリックを反映する洞察を加えます。私は、サーバーで一種の "ハンドシェイク"を行い、具体的にはUDPポートのトンネリングを設定するコードで、コードベースのプロセスをコード化したかなり醜いコードを手に入れました。残りのネットワークコードは "SendXMLViaTCPAndWaitForResponse()"型ヘルパー関数に抽象化されています。弾丸を噛むだけでそれほど難しいはずはありません。ヘルパーfctsを超えてほとんど記録されていないはずです。これを釘付けにしてくれてありがとう。 –

4

GnuTLSは、クライアント側とサーバー側の両方で、TCP接続の場合のみ使用することをお勧めします。今のところUDPデータは忘れてしまいます。 GnuTLSのドキュメントには、クライアントとサーバの両方を書くためのexample codeがあります。少なくともサーバー側(通常はTCPレスポンダ)には証明書が必要であることをご理解ください。クライアント側は匿名のIDで作業することができます(DHキー交換のみを使用するサーバー証明書がない例もありますが、これはman-in-the-middle攻撃を許可します)。

一般に、使用するライブラリに関係なく、SSLの原則を理解する必要があります。ライブラリの代替はOpenSSL(UnixとWindowsの両方)とSChannel(Windowsのみ)です。

2

Boost.AsioまたはACEでSSLサポートを試しましたか?どちらもOpenSSLのフードを使用し、TCP、UDP、SSLについても同様の抽象化を提供します。サンプルコードは、Boost.AsioとACEの両方のディストリビューションで利用できます。

SSLはストリーム指向(TCPとUDPの両方)ではなく、レコード指向であることに留意する必要があります。これは、たとえば、読み取り操作が完了する前に完全なSSLレコードを読み取る必要があるため、イベントを多重化する方法に影響する可能性があります。

2

アプリケーションを変更せずにこれを処理するには、stunnelプロジェクト(http://www.stunnel.org/)を調べるとよいでしょう。私はあなたのためにUDPを処理するとは思わない。

2

yaSSLとCyaSSLの組み込みSSL/TLSライブラリは過去に私にとってうまくいきました。組み込みシステムをターゲットにしているため、速度とサイズの両方に最適化されています。 yaSSLはC++で書かれており、CyaSSLはCで書かれています。これと比較して、CyaSSLはOpenSSLより20倍も小さくなります。

両方とも最新の業界標準(TLS 1.2まで)をサポートし、ストリーム暗号などのクールな機能を提供し、GPLv2および商用ライセンス(商用サポートが必要な場合)の下でデュアルライセンスです。 http://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html

製品ページ:http://yassl.com/yaSSL/Products.html

よろしく、
クリス

+0

こんにちはクリス、答えに感謝します。残念ながら、私の投稿から1年以上が経過しており、クライアントは数週間前にプロジェクトをキャンセルしてプロジェクトを中止しました。 –

+0

悲しいことに聞いてください。私はあなたの投稿以来、それは長い時間でしたが、私は将来の参考のために少なくとも投稿するだろうと思った。 – Chrisc

関連する問題