(プレーンTCPのドロップイン置換として)事前に配布された自己署名証明書を使用したTLSを使用して、アプリケーションのトラフィックを保護したいと思います。
NATが存在するため、2つのクライアントが直接直接通信できず、相互にトラフィックをトンネリングするためにアクセス可能なリレーに頼らなければならない場合があります。私はdクライアントとリレーの間の接続を保護したいのですが、リレーがクライアント向けのプレーンテキストを見ることも望まないのです。
クライアントはTLS経由でリレーに接続し、既存のTLS接続を介して別のTLSセッションを2番目のクライアントに確立する必要があるようです。 2回の暗号化は1回の暗号化よりも強力ではありません であることはわかっていますが、この場合、クライアントはどれほど問題を抱えていますか?
私がそれを正しく理解していれば、これはあなたの状況の大まかなネットワーク図です:
あなたはAとBが話したいと言っていますが、彼らは直接できないのでリレーを使用します。 Aにリレーへの暗号化接続(TLS)をセットアップさせ、リレーを(さらに別のTLSトンネルを介して)Bに接続するためのプロキシとして使用することを考えています。
これは複雑に聞こえますが、基本的にはhttpsプロキシまたは任意のVPNサーバー(たとえば、mycompany.example)を使用して別のhttpsサイト(たとえば、bank.example)に接続している場合、すでに暗号化に暗号化を重ねています。可能なオプションがどのように機能するかを見てみましょう(レイヤー化またはレイヤー化しない)。
オプション1:A <-> Bを暗号化しますが、A <-> RelayもB <-> Relayも暗号化しません
トンネル内をトンネリングしない場合は、パケットをAからリレーに、リレーからBに暗号化せずに送信します。ただし、これらの宛先はBであるため、トラフィックはB向けに暗号化され、誰も接続内容を読み取ることができません(AとBのみ)。 A <-> RelayとRelay <-> Bの間のパスをリッスンしている人に漏れている唯一の情報は、AとBが通信しているということです。リレーは接続内容を読み取ることができません。
オプション2:A-> RelayおよびA-> Bを暗号化します
ご質問のように、AとRelayの間、およびAとBの間にトンネルがある場合、A <-> Relayをリッスンしている人は、AがRelayと通信していることしか確認できません。また、Relay <-> Bでリッスンしている人には、Bと通信しているリレーのみが再び表示されます。リレーは接続内容を読み取ることができません。
オプション3:A-> RelayおよびB-> Relayを暗号化します
最後に、Aからリレーへの接続を暗号化するオプションがありますが、AからBへの暗号化はできません(BがNATの背後にあるため、Bがリレーへの(TLS)接続をまだセットアップしていると仮定します)。その場合、トラフィックはリレーに対して透過的ですが、監視している人には、Aからリレーへの接続とBからリレーへの接続のみが表示されます。
したがって、回線を傍受している人がパケットの宛先(つまりAとB)を見ることができるかどうかが問題かどうかによって異なります。二重暗号化とは、AとBのCPUパワーが2倍になることを意味します(リレーはコンテンツを復号化しないため、外層のみのため、単一の場合のみです)。しかし、それが大きな違いをもたらすとは思いません。
(クレジット:画像は https://draw.io で作成されました。XMLはこの投稿のソースにあります。)