ネットワーク上にあり、TCP を使用して互いに通信する多数のマシンがあるとします。
私の要求は次のとおりです。
- データは暗号化する必要があります。
- 同じネットワーク上であっても、許可されていないマシンにデータを送信してはなりません。
- 許可されていないマシンからデータを受信してはなりません。
- マシンは、他のマシンの IP アドレスしか知りません。
より想像しやすいように、許可されたクライアントのみが参加を許可され、すべての通信が暗号化されるチャット ネットワークを考えてみてください。
私の最初のアイデアは、TLS 証明書を使用することでした。
- 承認された各マシンには、その証明書のコピーがあります。
- 証明書を使用して、接続を暗号化できます。
- サーバー側で証明書を使用すると、サーバーの検証に使用できます。
- クライアント側で証明書を使用すると、クライアントの認証に使用できます。
- 許可されていないマシンは証明書を持っていないため、データの暗号化を解除したり、送信したり、受信したりすることはできません。
理論的には、これは期待どおりに機能するはずです。実際には、そうではありません。
問題の 1 つは、マシンが互いの IP アドレスしか認識しておらず、ドメイン名にバインドする必要がないことです。証明書は IP アドレスには推奨されません (また、Node.js は IP アドレスを CN として使用する証明書を検証することさえしません)、IP アドレスは時間の経過とともに変化する可能性があるため、それが正しいアプローチであるかどうかを考え始めました。
もちろん、これらすべてを自分で実装することもできます: 暗号化層、認証スキーマ... しかし、その後は実行しません。これを解決するより便利な方法があれば、これに感謝します。
したがって、基本的には、ドメイン名へのバインディングのためではなく、特定の証明書が存在するため、暗号化と認証に TLS 証明書を使用することになります。
これをどのように実装し、上記の問題を解決しますか? または - 私は完全に間違った方向に走っていますか? これをより良い方法で解決するにはどうすればよいですか?