Как использовать 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
. Попробуйте снизить время ожидания и перехватить исключение тайм-аута, а затем повторить попытку.
ИЗМЕНИТЬ
Большая часть того, что я написал в предыдущей версии этого ответа, была неправильной.