Тайм-аут HttpWebRequest при первом запросе с неверным сертификатом сервера - PullRequest
2 голосов
/ 25 января 2012

Я использую следующий код для принятия неверных сертификатов сервера:

ServicePointManager.ServerCertificateValidationCallback = delegate(object s,
  X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    Debug.WriteLine("Returned certificate valid");
    return true;
}

И этот код для запроса:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://localhost/test");
req.Timeout = 5000;
try {
    Debug.WriteLine("Checking...");
    HttpWebResponse response = (HttpWebResponse)req.GetResponse();
    Debug.WriteLine("Done");
}
catch
{
    Debug.WriteLine("Error");
    //error
}

При первом запуске этого запроса он ждет 5 секунд, а затем выдает исключение тайм-аута. Обратный вызов проверки выполняется успешно незадолго до истечения времени ожидания, и я вижу, что в него передан правильный (недействительный) сертификат.

Если я увеличу время ожидания до 15 секунд, для выполнения обратного вызова потребуется 15 секунд, а затем запрос истечет.

Последующие запросы (без перезапуска программы) имеют показатель успешности около 90%. (Тайм-аут 10%; остальные возвращаются почти мгновенно.) Что здесь происходит?

РЕДАКТИРОВАТЬ: Если я отключаю сетевое соединение, все запросы возвращаются успешно, что заставляет меня думать, что он пытается связаться с ЦС или чем-то ... Почему истекает время ожидания, а не выдается исключение безопасности, и как я могу остановить это?

РЕДАКТИРОВАТЬ 2: Я прокомментировал предложение тайм-аута @ ScottSmith и все запросы теперь выполняются успешно! Иногда они преуспевают перед старым периодом ожидания, который действительно смущает меня. Могу ли я заставить .net прекратить попытки проверить сертификат за кулисами?

РЕДАКТИРОВАТЬ 3: Я нашел сообщение на форуме, которое, я думаю, объясняет мою проблему. Посмотрите на последний пост на этой странице: http://www.pcreview.co.uk/forums/ie-going-very-slow-if-certificate-isnt-valid-t735059.html Я использовал wireshark, и как только запрос отправлен, 3 запроса DNS для www.download.windowsupdate.com сделаны. Как только они терпят неудачу (так как компьютер не подключен к Интернету), наконец вызывается обратный вызов для проверки сертификата, и запрос завершается. Если кто-нибудь может придумать способ отключить это поведение, это было бы удивительно.

Ответы [ 4 ]

2 голосов
/ 25 января 2012

Трудно сказать, что не так, но некоторые вещи нужно проверить:

  • установить ServicePointManager.CheckCertificateRevocationList явно на false после добавления обработчика (этопо умолчанию false, но в вашем случае это может быть true)

  • проверить значение sslPolicyErrors в вашем обратном вызове, возможно, это даст вам некоторое представление о том, что происходит

  • проверьте свойства req.ServicePoint, это может помочь сузить, что происходит (особенно, чтобы увидеть, перенаправляется ли ваш запрос)

  • проверьте настройки прокси, они могут быть частью проблемы

  • много трафика TCP / IP происходит?(проверьте с помощью netstat, посмотрите, есть ли у вас несколько сокетов TIME_WAIT)

  • что произойдет, когда вы попробуете этот URL из браузера?

  • проверьте журналына веб-сервере (IIS?) для чего-либо, касающегося http-запроса

ОБНОВЛЕНИЕ - после РЕДАКТИРОВАНИЯ с OP:

вы можете попытаться установитьServicePointManager.DnsRefreshTimeout до очень высокого значения и посмотрите, поможет ли это, НО понять, что это может иметь другие негативные последствия!

1 голос
/ 05 октября 2012
1 голос
/ 15 июня 2012

Ответ для ОП Редактировать 3 :
Я испытывал ту же проблему. Ответом оказалось отключение компонента автоматического обновления корневых сертификатов путем редактирования параметров групповой политики в Windows. Объяснение того, как в Windows Server 2008 находится здесь: http://technet.microsoft.com/en-us/library/cc734054%28v=ws.10%29.aspx

Обновление со сводкой шагов:

  1. Открыть редактор локальной групповой политики (введите gpedit.msc из командной строки)
  2. Перейдите к: Административные шаблоны -> Система -> Управление интернет-связью -> Настройки интернет-связи
  3. Двойной щелчок «Отключить автоматическое обновление корневых сертификатов»
  4. Нажмите «включено», нажмите «ОК».
0 голосов
/ 20 февраля 2014

У меня была проблема с написанным мною приложением, которое работало в среде WinPE 4.0, где мы использовали двусторонний SSL.

Потребовалась минута, чтобы установить первоначальное соединение. Похоже, то, что вы говорили, это ваша проблема в вашем редактировании.

Из-за окружения нет редактора групповой политики, поэтому мне нужно было отследить значение реестра, которое его поддержало, чтобы я мог установить его в автономном режиме wim.

HKLM\Software\Policies\Microsoft\SystemCertificates\AuthRoot

DisableRootAutoUpdate DWORD Value 1

Источник: http://www.group -policy.com / ref / policy / 452 / Turn_off_Automatic_Root_Certificates_Update

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...