Проблемы с установлением безопасного соединения WebSocket (WSS) в консольном приложении C# с помощью WebSocketSharpC#

Место общения программистов C#
Ответить
Anonymous
 Проблемы с установлением безопасного соединения WebSocket (WSS) в консольном приложении C# с помощью WebSocketSharp

Сообщение Anonymous »

Добрый день!
Я разработчик-самоучка, стремящийся расширить свои знания и улучшить свои навыки. В настоящее время я работаю над созданием безопасного соединения WebSocket (WSS) в консольном приложении C# с использованием библиотеки WebSocketSharp. Несмотря на мои усилия, я столкнулся с несколькими проблемами и был бы признателен за рекомендации.
Цель: установить безопасное соединение WebSocket (WSS) между сервером и клиентом с помощью библиотеки WebSocketSharp в консоли C#. приложение.
Справочная информация:
Моя цель — создать проект Unity, в котором один экземпляр Unity выступает в качестве сервера, а другой — в качестве клиента. Я начал с тестирования библиотеки WebSocketSharp в Visual Studio 2022 с использованием консольного приложения (.NET Framework) как для клиента, так и для сервера. Незащищенное соединение WebSocket (ws) работает, поэтому я реализовал его в Unity, в результате чего сервер и клиент Unity работали, но по-прежнему использовали ws. Теперь я пытаюсь перейти на безопасное соединение WebSocket (wss). Ниже я сосредоточусь в основном на реализации консольного приложения.
Текущее состояние:
  • Соединение WebSocket (ws) работает без проблем. Интернет использует доменное имя как в Unity, так и в консольной реализации клиента и сервера.
  • Подключение к WSS проблематично: в реализации Unity сервер не запускается из-за ошибки без «HMAC». не поддерживается». В реализации консольного приложения на сервере нет ошибки, но клиент немедленно запускает ws.OnClose, даже не запуская ws.OnOpen.
Проблемы:
  • В реализации Unity я столкнулся с ошибкой «HMAC не поддерживается», которую я пытался устранить с помощью Bouncy Castle, но безуспешно.

    В реализации Unity я столкнулся с ошибкой «HMAC не поддерживается», которую я пытался устранить с помощью Bouncy Castle, но безуспешно.

    li>
    В консольном приложении Visual Studio C# соединение WSS запускается и сразу закрывается без успешного установления соединения. «Соединение закрыто: при подключении произошло исключение.
    Ошибка: произошла ошибка при отправке данных».
Среда:
  • Консольное приложение C# в Visual Studio 2022
  • Unity Game Engine
  • Библиотека WebSocketSharp: websocket-sharp-core(https://github.com/ImoutoChan/websocket-sharp-core)
  • ОС Windows
  • Переадресация портов маршрутизатора для настройка сервера
  • DuckDNS для доменного имени
  • SSL-сертификат от Let's Encrypt
Код клиента:

Код: Выделить всё

using System;
using WebSocketSharp;

namespace ClientLast
{
class Program
{
static void Main(string[] args)
{
try
{
//using (var ws = new WebSocket("ws://abyza.duckdns.org:50001/Echo"))
using (var ws = new WebSocket("wss://abyza.duckdns.org:50001/Echo"))
{
ws.OnMessage += (sender, e) =>
Console.WriteLine("Received from server: " + e.Data);

ws.OnOpen += (sender, e) =>
Console.WriteLine("Connection opened");

ws.OnClose += (sender, e) =>
Console.WriteLine("Connection closed: " + e.Reason);

ws.OnError += (sender, e) =>
Console.WriteLine("Error: " + e.Message);

ws.Connect();
ws.Send("Hello, World!");
Console.WriteLine($"Running");

Console.ReadKey(true);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
Console.WriteLine($"Stack Trace: {ex.StackTrace}");
}
Console.WriteLine($"Ended");
Console.ReadKey();
}
}
}

Код сервера:

Код: Выделить всё

using System;
using System.Security.Cryptography.X509Certificates;
using WebSocketSharp;
using WebSocketSharp.Server;

namespace websocketServer
{
class Program
{
static void Main(string[] args)
{
try
{
//var wssv = new WebSocketServer(System.Net.IPAddress.Any, 50001);
var wssv = new WebSocketServer(System.Net.IPAddress.Any, 50001,true);

// Load the PFX certificate
var cert = new X509Certificate2("D:\\12.  vscode projects\\websocketServer//certificate.pfx", "pass");
wssv.SslConfiguration.ServerCertificate = cert;

wssv.AddWebSocketService("/Echo");
wssv.Start();

Console.WriteLine("WebSocket server started on wss://localhost:443");
}
catch (Exception ex)
{
Console.WriteLine($"Error starting server: {ex.Message}");
}

Console.ReadKey();
}

public class Echo : WebSocketBehavior
{
protected override void OnMessage(MessageEventArgs e)
{
Console.WriteLine($"Received message: {e.Data}");
Send(e.Data);
}
}
}
}

SSL-сертификат:
  • Получен с помощью DuckDNS и Certbot Let's Encrypt
  • Файлы сертификатов: cert.pem, Chain.pem, Fullchain.pem, privkey.pem
  • Преобразованы в .pfx с помощью:

Код: Выделить всё

openssl pkcs12 -export -out certificate.pfx -in combined.pem

Код: Выделить всё

PS D:\3_apps\5_vscode_projects\website server\sslcert - Copy> certutil -p pass -dump certificate.pfx
================ Certificate 0 ================
================ Begin Nesting Level 1 ================
Element 0:
Serial Number: redacted
Issuer: CN=ISRG Root X1, O=Internet Security Research Group, C=US
NotBefore: 13/03/2024 8:00 am
NotAfter: 13/03/2027 7:59 am
Subject: CN=E5, O=Let's Encrypt, C=US
Non-root Certificate
Cert Hash(sha1): redacted
----------------  End Nesting Level 1  ----------------
No key provider information
Cannot find the certificate and private key for decryption.

================ Certificate 1 ================
================ Begin Nesting Level 1 ================
Element 1:
Serial Number: redacted
Issuer: CN=E5, O=Let's Encrypt, C=US
NotBefore: 13/06/2024 2:47 pm
NotAfter: 11/09/2024 2:47 pm
Subject: CN=abyza.duckdns.org
Non-root Certificate
Cert Hash(sha1): redacted
----------------  End Nesting Level 1  ----------------
Provider = Microsoft Software Key Storage Provider
Private key is NOT plain text exportable
Encryption test passed
CertUtil: -dump command completed successfully.
Другие условия:
  • Я использовал переадресацию портов на домашнем маршрутизаторе на свой ноутбук для обслуживания веб-сайта, WebSocket, и сервер сертификатов SSL.
  • Я знаю, что сертификат работает, потому что я использовал файлы fullchain.pem и privkey.pem в файле Python для запуска простого веб-сайта, который я мог успешно открыть с помощью HTTPS. .
  • Чтобы создать файл .pfx, я сначала объединил файлы fullchain.pem и privkey.pem в один файл.pem.
Вывод консоли клиента с помощью ws:

Код: Выделить всё

Connection opened
Running
Received from server: Hello, World!
Connection closed:
Ended
Вывод консоли клиента с помощью wss:
Connection closed: An exception has occurred while connecting.
Error: An error has occurred in sending data.
Running
Ended
< /code>
Вопросы: < /p>
  • Что может вызвать немедленное закрытие соединения WSS в приложении C# Console? < / li>
    Как устранить ошибку «HMAC не поддерживается» в Unity для установки безопасного соединения WebSocket?
  • Есть ли какие-либо дополнительные конфигурации или шаги, которые я мог бы предпринять? пропустили настройку библиотеки WebSocketSharp для безопасных соединений?
Спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/786 ... le-app-usi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»