質問

このコードを使用して、指定された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にもかかわらず、ブラウザとバランサー間の安全なトラフィックであることがわかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top