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