web-dev-qa-db-ja.com

プロキシとフロントエンドの間で証明書を共有するにはどうすればよいですか?

職場では、Webに接続するフロントエンドサーバーとバックエンド間のプロキシを含む、WebSocketチャットアプリケーションの参照トポロジの作成を検討するように求められました。現時点では、開発用に同じサーバーでフロントエンドとバックエンドを実行していますが、ラボの完全に別のサーバーにあるプロキシを指すようにWebSocketを一時的に設定しています。どちらのサーバーも内部ネットワーク上にあり、それぞれに個別の自己署名証明書があります。

WebSocket over TLSをテストしていたところ、プロキシに直接接続して証明書に例外を作成するまで、証明書に自己署名されているため(例外を作成するためのダイアログを表示せずに)失敗しました。その後、それは完全に問題なく動作しましたが、実際にはビジターはおそらくそれを許可されません。したがって、両方を同時に認定する方法を見つける必要があります。

私の知る限り、これを行う主な方法は次のとおりです。

  • プロキシとフロントエンドを異なるサブドメイン(たとえばfrontend.domain.comおよびproxy.domain.com)に配置し、サイトのワイルドカード証明書。これはラボでの作業がより速くて簡単ですが、IETF これを推奨しません
  • サブジェクトの別名を持つ単一の証明書を使用し、_の下にfrontend.mydomain.comproxy.mydomain.comの両方を含めますSANwww.mydomain.comのフィールド。私の知る限り、これは不正な/バグのあるドメインを保証する問題を共有しています。
  • 2つのサーバーに完全に別々の証明書を使用します。これは、すでに行っているようです。特に自己署名証明書を使用するのは面倒ですが、1つのドメインが侵害された場合、それは1つの障害点にすぎません。ここでの私の主な質問は、プロキシとフロントエンドの証明書が自己署名されていない場合、これが機能する可能性が高いということです。

上記で見逃したことはありますか、それとも他の方法はありますか?

EDIT 22/07/2015:余談ですが、同じメカニズムを介してXMLHttpRequestを送信しているときに、SSLハンドシェイクを続行できるようにするにはプロキシとバックエンド間の証明書の検証をオフにする必要があることがわかりました。私の自己署名証明書が問題の真の原因だった場合。しかし、それでもおそらく上記の私の問題は解決しません。

6
Philip Rowlands

自己署名証明書がある場合は、クライアントがそれを信頼する必要があります。

あるいは、クライアントが証明書が信頼できるかどうかをチェックしないようにすることもできますが、それはひどい考えです。

その方法はクライアントによって異なります。次のようなものがあれば:

[user-agent]---------[frontend]---------[proxy]---------[backend]

ユーザーエージェント(おそらくブラウザ)はフロントエンドのクライアント、フロントエンドはプロキシのクライアント、プロキシはバックエンドのクライアントです。

ここの各クライアントは、サーバーによって提供された証明書を信頼する必要があります。これは、すでに信頼されているエンティティによって署名されているか、自己署名証明書をトラストストアに追加しているためです。

はい、自己署名はあなたに問題を与える可能性があります

スケーラビリティの理由でプロキシが存在する場合、将来的にはより多くのバックエンドホストが存在します。

フロントエンドの背後にあるすべての通信が組織の内部にある場合は、独自の内部CAをセットアップし、そのルート証明書をフロントエンドとプロキシで信頼できます。

この方法では、新しいホストをそれぞれ独自の証明書で内部的に追加でき、クライアントは自動的にそれを信頼します。

独自のCAを展開するかどうかに関係なく、通常は異なるサーバーに異なる証明書を使用することをお勧めします。キーが危険にさらされた場合、そのキーの証明書を取り消す必要があり、危険にさらされたものと証明書を共有するすべてのホストにも新しい証明書が必要になります。

2
GnP