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