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