Mono HTTPListener在使用自签名SSL证书时抛出exception

我使用Mono HTTPListener类在Linux上编写了一个小型Web服务器。 它适用于http请求。 但是,如果我使用自签名SSL证书(使用openssl创build并使用httpcfg安装),只要浏览器请求发出,它就会抛出不可捕获的exception。

例外是:

Unhandled 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 

这里是完整的代码:

 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); } } } } 

这是我第一次使用浏览器的情况。 浏览器将显示“不安全的证书!你想继续(不推荐)?”。 如果我点击是并重新启动崩溃的服务器应用程序将从那一刻起工作。

我怎样才能解决这个问题?

另外,我不能用try块捕获这个exception。 它将永远终止我的申请。 我怎样才能防止呢?

应该修复一个未发布的错误修复https://bugzilla.xamarin.com/show_bug.cgi?id=52675 …虽然我还没有机会测试。

我也看到了这一点,目前正试图找到一种方法来处理异常。 这看起来是Mono中的一个bug。

在证书验证以任何方式失败时发生。

只要证书通用名(dns)与我试图发送获取请求的URL中使用的dns相同,我就获得了CA签名的证书来解决问题。 如果我改为在URL中指定公共IP地址(证书没有被注册),单声道应用程序将会崩溃,出现未处理的异常。

我们正在考虑的一个选择是实现一个基于TCP的网络服务器,它将使用Tcplistner而不是沉重的Httplistner,这将反过来解决单身httplistener前缀在绑定到NAT后面的内部IP时无法正常工作的其他问题。 这意味着证书也可以在编程上受到约束,只需要更多的工作。