2012-04-27 1 views
4

私はsslまたはplain httpのいずれかにバインドされるWebサービスを持っています。 Javaクライアントは、サーバーのホストとポートを認識するように構成されています。クライアントが接続すると、私はhttp://host:port/serviceのようなサーバのエンドポイントを構築します。クライアントは、サーバがssl-serverを使用しているかどうかを知っていないので、常に1つのポートにバインドされているので、安全であるかどうかはわかりません。さて、問題は、別のパラメータを導入せずにクライアントにこれを発見させる方法です。プレーンなhttp要求に挑戦して、ある例外でssl(またはその逆)にフォールバックすることはできますか?あるいは、私は明示的に新しい接続パラメータをクライアントに導入する必要がありますか?SSLを正常に検出する方法

答えて

3

サーバー側では、Grizzly's port unificationのような実装を使用できます。これは、同じポート上でHTTPとHTTPSを処理するために使用できます。これは、どちらの場合も、クライアントが最初に話し、HTTP要求またはSSL/TLSクライアントのHelloメッセージを送信するという事実に依存しています。これはサーバー側では非常に便利です(ただし、私は一般的に同じポートで2つのプロトコルを実行することをお勧めします)。 (あなたが尋ねているものである)クライアントの観点からは

、の結果は次のとおりです。

  • クライアントの話が最初にそれは常に最初に試してみなければならないことを意味しているという事実。 SSL/TLSとプレーンなHTTPサービスを話そうとする場合、あるいはその逆の場合には、ある種の例外を予期してください。
  • サーバがポート統合を使用する場合、信頼性の高い方法を見つける方法はありません。

ポート統一を除いて(これはまれなケースです)、過去の試行の結果をキャッシュすることができます。もっと根本的

、セキュリティの観点から、使用すべきプロトコル知ることは、脆弱性を紹介しません:お使いのシステムは、(blindly relying on automatic redirectsと同じように、同様の方法で)攻撃をダウングレードして公開されます。あなたのユーザエージェントがHSTSをサポートしているなら、それを調べる価値があります(ただし、HTTPSで使用するサイトをユーザエージェントが記憶する必要があります)。

いずれにしても、セキュリティが懸念される場合、で、クライアントはhttps://をいつ使用するかを設定する必要があります。

+0

これは私が後になっているようです。セキュリティは懸念事項です。そうでなければ、まずはSSLがありません。しかし、この特定のケースでは、トラフィックを暗号化するだけで済み、認証は問題ではないので大したことではありません。実際、この場合のクライアントは、実際には同じ種類の別のノードを呼び出すサーバーノードです(クラスター内で何らかの話があります)。新しいパラメータを導入するのを避けるためにちょうどよいショートカットが必要でした。これを行う方法は信頼できるものではないように思えますが、私はポートの統一物で遊んでいきます。興味深いことに、ありがとう! – Dima

+0

サーバの認証(暗号化前)は、トラフィックをまったく変更できない受動的な攻撃者(盗聴者)を最大限に抱えていることが分かっていない限り、常に問題になります。 – Bruno

+0

そうだね、盗聴者は私の場合は脅威ではない – Dima

関連する問題