Как использовать 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 для всего приложения.

Ответ 1

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

Ответ 2

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

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

ИЗМЕНИТЬ

Большая часть того, что я написал в предыдущей версии этого ответа, была неправильной.