SSLへのHttpWebRequestが失敗する
-
04-07-2019 - |
質問
このコードを使用して、指定されたURLにリクエストを送信しています:
private static string GetWebRequestContent(string url)
{
string sid = String.Empty;
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.KeepAlive = false;
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(res.GetResponseStream()))
{
sid = sr.ReadToEnd().Trim();
}
}
return sid;
}
3台のサーバーが背後にあるWork Load Balancerのスティッキネスをテストするために使用しています。それらはすべて、sid.htmと呼ばれる静的HTMファイルを持ち、そこにサーバーのサーバーIDが書き込まれます。
HTTPを使用したURLの場合、これは正常に機能します。ただし、HTTPSでは機能しません。この例外が発生します:
リクエストは中止されました:SSL / TLSセキュアチャネルを作成できませんでした。
現時点では、WLBの背後にあるサーバーは2台のみで、ファイアウォールの背後にあるパブリックIPを持つサーバーは1台のみです。スタンドアロンサーバーにアクセスするとHTTPS要求は正常に機能しますが、WLBにアクセスすると上記のエラーが発生します。
1つのこと:単一のサーバーとWLBのヒットを切り替えるために、hostsファイルを使用します。私のドメインのDNSレコードは、現時点では単一のサーバーを指しています。そこで、ホストファイルにレコードを入れてWLBにアクセスします。これは問題を引き起こさないはずです...
私の質問:HttpWebRequestはどのSSL資格情報/証明書を使用しますか? 40ビットDESまたは56ビットDESを使用する場合、それが理由です。これらはWLBで無効になっているためです。しかし、IE3およびNetscape 1および2以降、これらの証明書はブラウザーで使用されていません。
解決
ブラウザで完全に動作します。
質問を投稿してから1分後に解決策を見つけました:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
それは、HttpWebRequestがTLS 1.0を使用していたことを意味します-わかりませんが、それは40ビットDESまたは56ビットDESであり、WLBで無効になっていると思います。
他のヒント
ロードバランサーで考慮したい場合があります。使用するものは、HTTPSの安全なトラフィックを安全でないHTTP接続で背後のサーバーに転送します。ロードバランサーとブラウザー間の接続はまだ安全ですが、バランサーとWebサーバー間の安全なプロトコルのオーバーヘッドは不要です。
Webサーバーで安全な接続を検出したかったのですが、最初はHTTPS接続を確認できませんでした。そのとき、バランサーの背後のトラフィックはすべて安全ではないことに気付きました。私たちが知ったら意味がありました。
ここで行うことは、バランサー(ポート443)に着信するすべての安全なトラフィックをポート81(代替HTTP)に転送し、その後、すべての通常のHTTPトラフィック(ポート80&81;)をポート80に転送します。 Webサーバー上のポートであり、80は安全ではなく、81はWebサーバーでのすべてのHTTPにもかかわらず、ブラウザとバランサー間の安全なトラフィックであることがわかります。