Подтвердить что ты не робот

HttpWebRequest.GetRequestStream() прерывает таймаут при подключении SSL под Windows 7/Vista

У меня есть приложение Windows С# (.Net 3.0 Framework), которое вызывает вызов веб-службы PHP с помощью HttpWebRequest.

В Win 7 и Vista​​b > , если вызов выполняется через не SSL (т.е. http://), код работает нормально. Когда вызов изменен для вызова SSL (https:) версии ссылки, время истекает в HttpWebRequest.GetRequestStream(). Это происходит каждый раз.

Когда это же приложение запускается на машине Windows XP, он отлично работает с использованием HTTP или HTTPS-url.

В коде есть код принятия всех сертификатов сервера. Кроме того, я добавил журнал System.Net. Он записывает журнал, но из-за того, что пакеты зашифрованы, вы действительно не видите многого, кроме заявления о прерывании таймаута.

Я также пробовал Fiddler, но снова с зашифрованными пакетами, я не вижу многого. BTW, когда я пытаюсь использовать Fiddler2 для расшифровки приложения, зависает, чтобы он не был успешным.

В любом случае, любая помощь будет оценена по достоинству. Спасибо.

Я добавлю:

  • Я могу установить telnet в порт
  • Я попытался запустить приложение в качестве администратора
  • Я пробовал режим совместимости с Win XP (пробовать что-либо)
  • Я выделил код подключения в простое автономное приложение
4b9b3361

Ответ 1

Эта ошибка появилась в рабочем приложении С# после миграции веб-сайта, доступ к которому был получен на новый сервер, и это указывает на проблему на стороне сервера. В самом деле, мы, наконец, решили эту проблему, установив значение "ServerName" в файле конфигурации Apache в соответствии с именем домена, зарегистрированным в сертификате. (Еще один форум отметил, что установка "ServerAlias" также будет работать.)

В частности, файл httpd.conf для сайта SSL имел следующий раздел в разделе VirtualHost:

ServerName www.secure.mydomain.com

Сертификат был зарегистрирован на secure.mydomain.com, а URL, к которому мы обращались, также был https://secure.mydomain.com/test.html.

Итак, просто изменив файл conf на следующий и перезапустив Apache, сделал трюк:

ServerName secure.mydomain.com

Возможно, также работало следующее:

ServerName www.secure.mydomain.com
ServerAlias secure.mydomain.com

Здесь приведена дополнительная дополнительная информация для дальнейшего использования:

Две ошибки, которые мы видели в System.Net.trace.log, были следующими:

System.Net.Sockets Error: 0 : [4316] Exception in the 
    Socket#18796293::Receive - A blocking operation was 
    interrupted by a call to WSACancelBlockingCall
System.Net Error: 0 : [4316] Exception in the 
    HttpWebRequest#35191196:: - The operation has timed out

Вот все, что мы пробовали, которые не решили проблему:

  • установка промежуточных сертификатов из поставщика сертификатов SSL в Apache (требуется)
  • изменение пользовательского агента в веб-запросе (бездействия)
  • изменение тайм-аутов на стороне сервера и на стороне клиента и ограничений памяти (бездействия)
  • тестирование со статической страницей (без эффекта)
  • тестирование с другими сайтами https (они отлично работали)
  • добавление сертификата в хранилище доверенных сертификатов (бездействия)
  • приобрести и установить сертификат у другого издателя сертификата (бездействия)
  • сравнить файлы виртуального хоста .conf с известного рабочего сервера на проблемном сервере (это привело нас к решению проблемы).

URL https можно было бы открыть в Opera, IE8 и Firefox без проблем. WGET для Windows жаловался на недопустимый сертификат, но опять же, WGET является старым приложением и, похоже, не доверяет столько сертификатов.

Клиентское приложение С# работало под управлением Windows XP, но не в Windows 7 или Windows Vista. Похоже, что Windows 7 и Vista более агрессивны в отношении проверки сертификата. Они не предоставляют информационное сообщение об ошибке, когда он терпит неудачу, а вместо этого просто время ожидания во время установления связи SSL.

Ответ 2

Может ли сертификат SSL ссылаться на CRL, который занимает слишком много времени?