Сюжетная:
Я хотел создать свой собственный веб-сервер на c # (первая попытка). Все прошло хорошо (я использовал Visual Studio для кодирования приложения и Firefox для проверки , правильно ли я поступил), и мне удалось создать базовый TCPServer. Когда я пытался добавить поддержку SSL, я столкнулся с проблемой.
- Я пытался аутентифицироваться как TcpServer с поддержкой SSL с использованием SSLStream.AuthenticateAsServer ([самозаверяющий сертификат]) в течение последних 7 дней
Проблема:
Когда я получаю [Upgrade-Insecure-Requests: 1] от моего любимого Firefox, я пытаюсь [SSLStream.AuthenticateAsServer ([самозаверяющий сертификат])]. При этом мой код застрял (но не зависает / не падает) в этой строке, в то время как мой Firefox просто загружается вечно , не отправляя мне ответ.
Код:
запуск моего сервера
TCPServer.ServerStart(8080);
(слушатель определяется в моем классе TCPServer)
internal static TcpListener listener;
async internal static void ServerStart(int port)
{
if (listener == null)
{
listener = new TcpListener(IPAddress.Any, port);
}
listener.Start();
//clients
await Task.Run(()=> SucheNachBesuchern());
listener.Stop();
}
прием клиентов
private static void SucheNachBesuchern(){
TcpClient Besucher;
while (true)
{
Besucher = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ThreadProzess, Besucher);
}
}
обработка принятых клиентов
private static void ThreadProzess(object Besucher) {
TcpClient besucher = (TcpClient)Besucher;
Abfertige(besucher);
besucher.Close();
besucher.Dispose();
}
private static void Abfertige(TcpClient Besucher)
{
//Reading the Request
StreamReader Auftrag = new StreamReader(Besucher.GetStream());
List<String> AuftragNachricht= new List<String>();
while (Auftrag.Peek()!=-1) {
AuftragNachricht.Add(Auftrag.ReadLine());
}
//Anfrage = request Class with bool Anfrage.SSLAnfrage being true
//if the request contains 'Upgrade-Insecure-Requests: 1'
Anfrage Anfrage = Anfrage.VerarbeiteAuftrag(AuftragNachricht);
if (Anfrage.SSLAnfrage)// = if([request conatined 'Upgrade-Insecure-Requests: 1'])
{
//opening an SslStream to the TcpClient Besucher
SslStream SSLStream = new SslStream(Besucher.GetStream(), false);
try
{
//Authenticating as TcpServer supporting SSL !CODE IS STUCK AT THIS LINE!
SSLStream.AuthenticateAsServer([SELFSINGEDX509CERTIFICATE.cer using openssl pkcs12], clientCertificateRequired: false, enabledSslProtocols: System.Security.Authentication.SslProtocols.Default, checkCertificateRevocation: false);
//set timeouts for read and write
SSLStream.ReadTimeout = 5000;
SSLStream.WriteTimeout = 5000;
//tryig to catch my Firefox as new client on SSL port 443
TcpListener SSLListener = new TcpListener(IPAddress.Parse("192.168.178.72"), 443);
SSLListener.Start();
TcpClient SSLBesucher = SSLListener.AcceptTcpClient();
Debug.WriteLine("I'VE GOT A CLIENT HERE!!!!111");
}
catch (Exception Error) {
Debug.WriteLine($"---Error gefangen: {Error.ToString()}");
}
}//[...more Code]
(Из-за отсутствия каких-либо знаний по SSL
я использовал этот пример кода )