職場では、Webに接続するフロントエンドサーバーとバックエンド間のプロキシを含む、WebSocketチャットアプリケーションの参照トポロジの作成を検討するように求められました。現時点では、開発用に同じサーバーでフロントエンドとバックエンドを実行していますが、ラボの完全に別のサーバーにあるプロキシを指すようにWebSocketを一時的に設定しています。どちらのサーバーも内部ネットワーク上にあり、それぞれに個別の自己署名証明書があります。
WebSocket over TLSをテストしていたところ、プロキシに直接接続して証明書に例外を作成するまで、証明書に自己署名されているため(例外を作成するためのダイアログを表示せずに)失敗しました。その後、それは完全に問題なく動作しましたが、実際にはビジターはおそらくそれを許可されません。したがって、両方を同時に認定する方法を見つける必要があります。
私の知る限り、これを行う主な方法は次のとおりです。
上記で見逃したことはありますか、それとも他の方法はありますか?
EDIT 22/07/2015:余談ですが、同じメカニズムを介してXMLHttpRequestを送信しているときに、SSLハンドシェイクを続行できるようにするにはプロキシとバックエンド間の証明書の検証をオフにする必要があることがわかりました。私の自己署名証明書が問題の真の原因だった場合。しかし、それでもおそらく上記の私の問題は解決しません。
自己署名証明書がある場合は、クライアントがそれを信頼する必要があります。
あるいは、クライアントが証明書が信頼できるかどうかをチェックしないようにすることもできますが、それはひどい考えです。
その方法はクライアントによって異なります。次のようなものがあれば:
[user-agent]---------[frontend]---------[proxy]---------[backend]
ユーザーエージェント(おそらくブラウザ)はフロントエンドのクライアント、フロントエンドはプロキシのクライアント、プロキシはバックエンドのクライアントです。
ここの各クライアントは、サーバーによって提供された証明書を信頼する必要があります。これは、すでに信頼されているエンティティによって署名されているか、自己署名証明書をトラストストアに追加しているためです。
はい、自己署名はあなたに問題を与える可能性があります
スケーラビリティの理由でプロキシが存在する場合、将来的にはより多くのバックエンドホストが存在します。
フロントエンドの背後にあるすべての通信が組織の内部にある場合は、独自の内部CAをセットアップし、そのルート証明書をフロントエンドとプロキシで信頼できます。
この方法では、新しいホストをそれぞれ独自の証明書で内部的に追加でき、クライアントは自動的にそれを信頼します。
独自のCAを展開するかどうかに関係なく、通常は異なるサーバーに異なる証明書を使用することをお勧めします。キーが危険にさらされた場合、そのキーの証明書を取り消す必要があり、危険にさらされたものと証明書を共有するすべてのホストにも新しい証明書が必要になります。