Я использую следующий код для принятия неверных сертификатов сервера:
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 сделаны. Как только они терпят неудачу (так как компьютер не подключен к Интернету), наконец вызывается обратный вызов для проверки сертификата, и запрос завершается. Если кто-нибудь может придумать способ отключить это поведение, это было бы удивительно.