Подключение клиента к серверу 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 без него.
Приветствуется любой указатель.
Ответы
Ответ 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