Подтвердить что ты не робот

Подключение клиента к серверу TCP с использованием TLS 1.2

Я пытаюсь не подключить устройство к серверу .Net(4.5.2). Это TCP-соединение, открытое устройством, которое использует TLS 1.2.

  • На стороне сервера у меня есть стандартная реализация .NET-сервера TCP: SslStream завернутый через DotNetty
  • Я ничего не могу изменить на устройстве

Любой клиент .Net может успешно подключиться к моему серверу с помощью защищенного соединения TLS. Он работает при попытке с CURL, поэтому я пришел к выводу, что мой TCP-сервер работает нормально.

Итак, я сравнил (используя Wireshark) то, что было отправлено рабочим клиентом из того, что было отправлено устройством, которое не может подключиться. Значительная разница, которую я обнаружил, - это отсутствие (для устройства) Расширение имен серверов (SNI) внутри сообщения клиента Hello TLS.

Следующее, что я пробовал, - это вручную отправить данные на мой сервер с помощью Pcap.Net, то есть вручную отправить TCP SYN/TCP ACK/Client Привет сообщения с использованием массивов raw byte (необработанные данные, которые я получил (благодаря Wireshark) с устройства, пытающегося подключиться к моему серверу). Я подтвердил, что настройка неработающего массива байтов Hello Hello, добавив расширение Server Name, заставляет мое рукопожатие TLS работать.

Таким образом, очевидно, что у меня возникла проблема с клиентами, которые не включают расширение SNI и сервер, который отказывается от рукопожатия, если эта информация отсутствует.

Как я могу изменить способ поведения моего TCP-сервера для приема клиента, который не предоставляет расширение имени сервера? Возможно ли это, в первую очередь, с использованием стандартного .Net SslStream class?

AFAIK, расширение SNI не является обязательным, и оно зависит от клиента, чтобы решить, использовать его или нет, поэтому сервер должен теоретически принимать сообщение клиента Hello без него.

Приветствуется любой указатель.

4b9b3361

Ответ 1

.Net 4.5.2 поддерживает TLS1.2, но по умолчанию он отключен.

Для включения этого параметра вы должны явно определить набор протоколов безопасности.

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

для получения дополнительной информации см. следующую ссылку https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol%28v=vs.110%29.aspx