sslまたはプレーンhttpのいずれかにバインドできるWebサービスがあります。サーバーのホストとポートを認識するように構成されたJavaクライアント。クライアントが接続すると、http:// host:port/serviceのようにサーバーエンドポイントを構築します。クライアントは、サーバーがsslを使用しているかどうかを認識していません。サーバーは常に単一のポートにバインドされるため、安全であるかどうかはわかりません。さて、問題は、別のパラメータを導入せずにクライアントにこれを発見させる方法です。プレーンなhttpリクエストにチャレンジしてから、特定の例外でssl(またはその逆)にフォールバックできますか?または、クライアントに新しい接続パラメータを明示的に導入する必要がありますか?
1 に答える
サーバー側では、 Grizzlyのポート統合実装のようなメカニズムを使用できます。これは、同じポートでHTTPとHTTPSを提供するために使用できます。これは、どちらの場合も、クライアントが最初に通信し、HTTP要求またはSSL/TLSクライアントHelloメッセージを送信するという事実に依存しています。これはサーバー側で非常に便利です(ただし、一般に同じポートで2つのプロトコルを実行することをお勧めするかどうかはわかりません)。
クライアントの観点から(これはあなたが求めていることです)、その結果は次のとおりです。
- クライアントが最初に話すという事実は、それが常に最初に試みなければならないことを意味します。SSL / TLSをプレーンHTTPサービスと通信しようとした場合、またはその逆の場合は、ある種の例外が発生する可能性があります。
- サーバーがポート統合を使用している場合、確実に見つけることができる方法はありません。
ポートの統合はさておき(これは結局のところまれなケースです)、過去の試行の結果をキャッシュしようとすることができます。
より基本的には、セキュリティの観点から、どのプロトコルを使用すべきかわからない場合、脆弱性が発生します。システムはダウングレード攻撃にさらされます(自動リダイレクトに盲目的に依存するのと同じように)。ユーザーエージェントがHSTSをサポートしている場合は、それを調べる価値があります(ただし、HTTPSで使用するサイトをユーザーエージェントが覚えておく必要があります)。
いずれにせよ、セキュリティが心配な場合は、いつ使用するかを知るようにクライアントを構成する必要https://
があります。