HttpWebRequest.GetRequestStream () прерывается по таймауту на SSL-соединении в Windows 7 / Vista - PullRequest
11 голосов
/ 22 декабря 2010

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

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

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

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

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

В любом случае, любая помощь приветствуется. Благодаря.

Я добавлю:

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

Ответы [ 2 ]

9 голосов
/ 24 декабря 2010

Эта ошибка возникла в работающем приложении C # после переноса веб-сайта на новый сервер, что указывало на проблему на стороне сервера. Действительно, мы наконец решили эту проблему, установив значение «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 является старым приложением и, похоже, не доверяет так много сертификатов.

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

0 голосов
/ 23 декабря 2010

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

...