Windows PCで動作するアプリケーションを開発しています。アプリケーションは、LAN内のある種のデバイスに接続できます。接続先のデバイスへの複数のTCP接続を作成できます。 TLS/SSLを使用してすべてのTCP接続を保護したい。
これに対する素朴な解決策は、アプリケーションと反対側のデバイスとの間のすべてのTCP接続にTLS/SSLを使用することです。ただし、すべてのTCP接続はTLS/SSLネゴシエーション/認証プロセス全体を経由する必要があるため、これがどの程度のオーバーヘッドをもたらすかはわかりません。アプリケーション/ PCがネゴシエート/認証するだけでよいので、その必要はないと思います。すべてのTCP接続は同じ暗号化を使用します。使用したいデバイスにFTPサーバーもあります(SSL経由のFTPを考えています)。
PCからデバイスへの単一のTLS/SSL接続を作成してから、このトンネルを介してすべてのTCP/FTPデータを転送することはできますか?これは正しいソリューションですか、それともアプリケーションとデバイスの間で行う予定のすべての接続に対して単一のTLS/SSL接続を作成する方が良いでしょうか?
これは、VPNを探しているようですが、TLSでセキュリティを提供したいと考えています(IPSecなどではなく)。プラットフォームの互換性が問題ではない場合、マイクロソフトは、このようなSSL-VPNスキームを使用する Secure Socket Tunneling Protocol を開発しました。
あなたが話している「ある種のデバイス」もWindowsベースの場合、SSTPを実装するための追加のソフトウェアさえ必要ないかもしれません。
私はSSTPについてこれ以上の知識はありませんが、WikipediaのリンクとそのWikipediaの記事にリンクされているMSDNリソースには、必要なすべての情報が含まれているはずです。
代替はOpenVPNで、これはTLSを基礎となる接続プロトコルとしても使用でき、認証のためにサーバー側とクライアント側の証明書をサポートします。
複数のTLS接続を使用する必要があります。ただし、アプリケーションがTLS省略ハンドシェイクとセッション再開を使用して、おそらくセッションチケットを使用して複数の接続を開くことを確認する必要があります。
短縮ハンドシェイクとセッション再開を使用すると、アプリケーションで以前のフルハンドシェイクの暗号化パラメーターとマスターキーを再利用でき、新しいTLS接続を確立するコストを大幅に削減できます。完全なTLSハンドシェイクは、TLSバージョン、暗号、マスターキーをネゴシエートするために複数のラウンドトリップを必要とし、証明書チェーンを認証するために高額なRSA証明書操作を伴います。ラウンドトリップが1つであり、安価な対称暗号化操作である省略されたハンドシェイクと比較されます。
さらに、インフラストラクチャでサポートされている場合は、TLS False Startを試すこともできます。 TLS False Startを使用すると、データの送信をより早く開始でき、最初のバイトまでの時間をさらに短縮できます。
トラフィックの種類、つまりアプリケーションのニーズによって異なります。
新しい通信の待ち時間は重要なポイントですか?次に、そのTCP接続を開いたままにし、すべてを同じSSLセッションを介してトンネルすることができます。それとも、大量のデータを転送する必要があり、それを並列化できるでしょうか?次に、独自のSSLレイヤーを最上位にして、複数のTCP接続を確立します。