14

これが私の質問です。

現在、Windows C++ クライアント アプリケーション (Visual Studio 9、Qt 4.5) と通信する Linux サーバー アプリケーション (C++ - gcc を使用して記述) があります。

既存のプロトコルを完全に破壊することなく、通信を保護するために両側に SSL サポートを追加する最も簡単な方法何ですか?

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

私は過去に、セキュリティ証明書をゼロから作成する際に、このようなものを機能させるために必要な多くの問題を抱えていました。

既存の実用的なサンプル コードが理想的です。

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

4

5 に答える 5

11

SSL は非常に複雑なので、ライブラリを使用する必要があります。

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


2 番目の質問 (あまり苦労せずにライブラリを既存のコードに統合する方法) への回答: 現在のコードに依存します。intWinsock または socket メソッドを呼び出してsなどを送受信する単純な関数が既にある場合はstrings、それらの関数の中身を書き直すだけで済みます。そしてもちろん、ソケットをセットアップするコードを最初から変更します。

一方、Winsock/socket 関数を直接呼び出している場合は、同様のセマンティクスを持ちながらデータを暗号化して送信する関数を作成し、Winsock 呼び出しをそれらの関数に置き換えたいと思うでしょう。

ただし、 Google Protocol BuffersApache Thrift (別名 Facebook Thrift)などへの切り替えを検討することをお勧めします。Google の Protocol Buffers のドキュメントには、「プロトコル バッファが登場する前は、リクエストとレスポンスのハンド マーシャリング/アンマーシャリングを使用するリクエストとレスポンスのフォーマットがあり、多数のバージョンのプロトコルをサポートしていました。これにより、非常に醜いコードが作成されました。 ...」

現在、ハンド マーシャリング/アンマーシャリング フェーズにあります。それはうまくいく可能性があり、実際に私が取り組んでいるプロジェクトはこの方法を使用しています. しかし、それをライブラリに任せる方がはるかに良いです。特に、将来的にソフトウェアを更新することをすでに考えているライブラリです。

このルートに進む場合は、SSL ライブラリを使用してネットワーク接続をセットアップし、それらの接続を介して Thrift/Protocol Buffer データをプッシュします。それでおしまい。大規模なリファクタリングが必要になりますが、維持するコードが少なくなります。私が言及したそのプロジェクトのコードベースに Protocol Buffers を導入したとき、約 300 行のマーシャリング/デマーシャリング コードを取り除くことができました。

于 2009-07-09T19:59:02.487 に答える
2

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

覚えておく必要があるかもしれないことの1つは、SSLがストリーム指向(TCPとUDPの両方)ではなくレコード指向であるということです。これは、たとえば、読み取り操作完了を呼び出す前に完全なSSLレコードを読み取る必要があるため、イベントの多重化方法に影響を与える可能性があります。

于 2009-07-09T18:47:48.870 に答える
2

yaSSL および CyaSSL 組み込み SSL/TLS ライブラリは、これまでうまく機能していました。組み込みシステムを対象としており、速度とサイズの両方が最適化されています。yaSSL は C++ で書かれており、CyaSSL は C で書かれています。比較すると、CyaSSL は OpenSSL の 20 分の 1 まで小さくすることができます。

どちらも最新の業界標準 (TLS 1.2 まで) をサポートし、ストリーム暗号などのいくつかの優れた機能を提供し、GPLv2 と商用ライセンス (商用サポートが必要な場合) の下でデュアル ライセンスを取得しています。

既存のコードに CyaSSL を追加する方法についての SSL チュートリアルもあります: http://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html

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

よろしく、
クリス

于 2010-09-27T22:03:17.540 に答える
2

アプリケーションを変更せずにこれを処理するには、stunnel プロジェクト ( http://www.stunnel.org/ ) を参照してください。ただし、UDPを処理するとは思いません。

于 2009-07-18T02:07:32.837 に答える