Как использовать SSL3 вместо TLS в конкретном HttpWebRequest?

Мое приложение должно общаться с различными хостами через 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам