Ich habe einen kleinen Webserver unter Linux mit der Mono HTTPListener-Klasse geschrieben. Es funktioniert gut für HTTP-Anfragen. . Es ist jedoch ein un-abfangbare Ausnahme, wenn ich ein selbst signiertes SSL-Zertifikat (erstellt mit OpenSSL und installiert mit httpcfg) verwenden, sobald die Anfrage werfen forom ein Browser kommtMono HTTPListener löst Ausnahme aus, wenn selbstsigniertes SSL-Zertifikat verwendet wird
Die Ausnahme ist:
HierUnhandled Exception:
System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The client stopped the handshake.
at Mono.Security.Protocol.Tls.SslServerStream.EndNegotiateHandshake (IAsyncResult asyncResult) <0xb4b079c8 + 0x001cf> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) <0xb4b07428 + 0x0005f> in <filename unknown>:0
ist der vollständige Code:
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;
namespace SSLTest
{
class MainClass
{
static void Main()
{
try
{
HttpListener l = new HttpListener();
l.Prefixes.Add ("https://*:8443/");
l.Start();
Console.WriteLine("Server is running.");
while (l.IsListening)
{
//create the worker thread
HttpListenerContext ctx = l.GetContext(); //.GetContext() blocks until something comes in
if(ctx != null)
{
if(ctx.Request.RemoteEndPoint != null)
{
Thread workerThread = new Thread(() => RunWorker(ctx));
workerThread.Start();
}
}
}
Console.WriteLine("Server is stopped.");
}
catch(Exception ex)
{
Console.WriteLine ("Exception in Main: " + ex);
}
}
static void RunWorker(HttpListenerContext ctx)
{
try
{
if(ctx.Request != null)
{
if(ctx.Request.RemoteEndPoint != null)
{
Console.WriteLine ("Got request from " + ctx.Request.RemoteEndPoint.ToString());
string rstr = "Test Website!\n" + DateTime.Now.ToString();
byte[] buf = Encoding.UTF8.GetBytes(rstr);
if(buf!=null)
{
ctx.Response.ContentLength64 = buf.Length;
ctx.Response.OutputStream.Write(buf, 0, buf.Length);
}
}
}
}
catch(Exception ex)
{
Console.WriteLine ("@Exception in RunWorker: " + ex.Message);
}
}
}
}
Dies ist der Fall, wenn ich einen Browser zum ersten Mal verwenden. Der Browser zeigt etwas wie "Unsicheres Zertifikat! Möchten Sie fortfahren (nicht empfohlen)?". Wenn ich auf "Ja" klicke und die abgestürzte Server-App neu starte, funktioniert sie ab diesem Moment.
Wie kann ich das beheben?
Auch ich bin nicht in der Lage, diese Ausnahme mit einem try-Block zu fangen. Es wird immer meine Bewerbung beenden. Wie kann ich das verhindern?
Ich habe definitiv ein ähnliches Problem hier, obwohl mit einem CA signierten Zertifikat, nicht selbst signiert: http://StackOverflow.com/Questions/39604945/How-to-i-Catch-ssl-Exceptions-in -a-mono-httplistener-server –