2008-10-23 8 views
2

Я использую этот код, чтобы сделать запрос на заданный URL:HttpWebRequest для SSL не удается

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; 
} 

Я использую его, чтобы проверить stickyness произведения балансировки нагрузки, с 3-мя серверами за ним , Все они имеют статический HTM-файл с именем sid.htm, где записывается идентификатор сервера сервера.

Для URL-адресов с HTTP это работает нормально. Но с HTTPS это не сработает. Я получаю это исключение:

Запрос был прерван: не удалось создать безопасный канал SSL/TLS.

На данный момент у меня есть только 2 сервера позади WLB, а один - с открытым IP-адресом за брандмауэром. Запросы HTTPS работают нормально, если я попал на автономный сервер, но когда я попал в WLB, я получил вышеприведенную ошибку.

Одна вещь: Чтобы переключиться между ударом по одному серверу и WLB, я использую файл моих хостов. Записи DNS для моего домена указывают на единственный сервер на данный момент. Поэтому я поместил запись в файл моих хостов, чтобы попасть в WLB. Это не должно вызывать проблем ...

Мой вопрос: Какие SSL-сертификаты/сертификаты используются HttpWebRequest? Если он использует 40-битный DES или 56 бит DES, это причина, потому что они отключены в WLB. Но эти сертификаты не использовались в браузерах, поскольку IE3 и Netscape 1 и 2.

ответ

7

Он отлично работает в моем браузере.

Я нашел решение через 1 минуту после того, как я отправил вопрос:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

И это означает, что HttpWebRequest использует TLS 1.0 - я не знаю, но я предполагаю, что это 40 бит DES или 56 бит DES, который отключен в WLB.

0

Существует ощущение, которое вы можете рассмотреть с помощью балансировочного устройства. Те, которые мы используем, пересылают защищенный трафик HTTPS на серверы, расположенные за ним, на небезопасном HTTP-соединении. Соединение между балансировщиком нагрузки и браузером по-прежнему безопасно, но нет необходимости в надстройке защищенного протокола между балансиром и веб-серверами.

Мы хотели обнаружить безопасное соединение на наших веб-серверах, но изначально никогда не видели HTTPS-соединения. Именно тогда мы поняли, что движение за балансиром было все неуверенно. Когда-то мы поняли смысл.

Теперь мы отправляем весь безопасный трафик, поступающий в балансир (порт 443) на порт 81 (альтенсивный HTTP), а затем перенаправляем весь обычный HTTP-трафик (порты 80 & 81) в порт 80. Затем мы можем проверить порт на веб-сервере и знает, что 80 небезопасен, а 81 - безопасный трафик между браузером и балансиром, несмотря на то, что все его HTTP на веб-сервере.