Как использовать SSL3 вместо TLS в конкретном HttpWebRequest? - PullRequest
11 голосов
/ 12 июня 2010

Мое приложение должно общаться с различными хостами через https, и настройка по умолчанию ServicePointManager.SecurityProtocol = TLS хорошо работала до сих пор.Теперь у меня есть несколько хостов, которые (как показывает System.Net журнал трассировки) не отвечают на исходное сообщение рукопожатия TLS, но поддерживают базовое соединение открытым до истечения времени ожидания, вызывая исключение тайм-аута.Я попытался установить время ожидания HttpWebRequest на 5 минут, с тем же результатом.Предположительно, эти хосты ожидают рукопожатия SSL3, так как IE и Firefox могут подключаться к этим хостам с задержкой 30-40 секунд.Кажется, что в .NET есть какой-то механизм отката, который разлагает TLS на SSL3, но по какой-то причине он не срабатывает.

FWIW, вот сообщение о рукопожатии, которое отправляет мой запрос (обычный TLS 1.0 CLIENT HELLOсообщение):

00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9..
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l.
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./
00000030 : 00 35 00 05 00 0A C0 09-C0 0A C0 13 C0 14 00 32 : .5.............2
00000040 : 00 38 00 13 00 04 01 00-00 12 00 0A 00 08 00 06 : .8..............
00000050 : 00 17 00 18 00 19 00 0B-00 02 01 00             : ............    

Есть ли способ использовать SSL3 вместо TLS в конкретном HttpWebRequest или принудительно использовать запасной вариант?Кажется, настройки ServicePointManager глобальны, и я бы очень не хотел понизить настройку протокола безопасности до SSL3 для всего приложения.

Ответы [ 2 ]

14 голосов
/ 24 июня 2010

На самом деле, ServicePointManager настройки для каждого домена приложения. Это позволило мне обойти эту проблему, создав отдельный домен приложения, настроенный на использование только SSL3, в результате чего мой объект сбора данных MarshalByRefObjectWebClient, и WebRequest являются маршал-по-реф, но лучше уменьшить число кросс-доменных вызовов) и создание его там. Отлично работал в сочетании со схемой обнаружения на основе тайм-аута.

4 голосов
/ 12 июня 2010

.NET содержит положения для автоматического согласования более низких версий протокола.Значение ServicePointManager.SecurityProtocol определяет поведение.Может принимать 3 разных значения: SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls.Несмотря на глобальность, его можно изменить по мере необходимости.

Я не могу определить решение, не имея доступа к серверу с таким же ошибочным поведением.Единственное, что я могу сделать, это попытаться соединиться с параметром Ssl3 | Tls, и если это не сработает, повторите попытку с параметром Ssl3.Попробуйте уменьшить время ожидания и перехватить исключение, а затем повторить попытку.

РЕДАКТИРОВАТЬ

Многое из того, что я написал в предыдущей версии этого ответа, было неверным.

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