Я разработчик-самоучка, стремящийся расширить свои знания и улучшить свои навыки. В настоящее время я работаю над созданием безопасного соединения 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);
}
}
}
}
- Получен с помощью 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.
Код: Выделить всё
Connection opened
Running
Received from server: Hello, World!
Connection closed:
Ended
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
Мобильная версия