2016-10-24 3 views
17

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

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

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

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

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

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

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

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

Любой указатель был бы весьма благодарен.

+0

Боюсь, .NET не имеет никакого контроля над этим - 'SslStream' просто управляемая оболочка для SChannel и не всегда встретиться. Вы пытались возиться с обратным вызовом проверки сертификата? Приветствует ли вас клиент Hello? Можете ли вы сократить его, чтобы заставить его работать? – Luaan

+0

в качестве стороннего клиента может установить * любые * TLS1.2 соединения? например через браузер на данный https-сайт? – wal

+0

, если вы абсолютно должны получить эту работу, вы можете рассмотреть другую реализацию SSLStream, например, такой продукт, как https://www.eldos.com/sbb/desc-ssl-spec.php (я не одобряю только первую альтернативу i found) – wal

ответ

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

+0

Любопытно, можно ли это сделать в вызовах API. – brendo234

+0

@ brendo234 Я не уверен, чтобы понять, что вы имеете в виду. System.Net.ServicePointManager.SecurityProtocol - это вызов API. – cristallo

 Смежные вопросы

  • Нет связанных вопросов^_^