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