2016-09-20 7 views
1

Я пытаюсь добавить поддержку HTTPS на мой простой HTTP-сервер Mono. Он работает отлично в большинстве случаев, но приложение выходит из строя, когда возникает исключение SSL, например, клиент отменяет рукопожатие. Очевидно, что-то подобное не должно полностью разрушать его, поэтому мне нужно как-то поймать это исключение.Как я могу улавливать исключения SSL в сервере HTTP-HTTP?

Код:

static void Main(string[] args) 
    { 
     try 
     { 
      var listener = new HttpListener(); 
      string prefix = "https://*:8443/"; 
      listener.Prefixes.Add(prefix); 

      Console.WriteLine("Starting HTTP server at " + prefix); 

      listener.Start(); 

      while (true) 
      { 
       try 
       { 
        var context = listener.GetContext(); 
        Console.WriteLine(context.Request.Url); 
       } 
       catch (Exception e) 
       { 
        Console.ForegroundColor = ConsoleColor.Red; 
        Console.WriteLine("Exception processing request: " + e); 
        Console.ResetColor(); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.ForegroundColor = ConsoleColor.Yellow; 
      Console.WriteLine("Exception caught! " + e); 
     } 
    } 

Вот бревно, когда я получаю ненадежный клиент пытается подключиться:

Starting HTTP server at https://*:8443/ 

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) <0x41e581b0 + 0x0022b> in <filename unknown>:0 
    at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) <0x41e57d20 + 0x00086> in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at Mono.Security.Protocol.Tls.SslStreamBase.EndRead (IAsyncResult asyncResult) <0x41e50110 + 0x0015f> in <filename unknown>:0 
    at Mono.Net.Security.Private.LegacySslStream.EndAuthenticateAsServer (IAsyncResult asyncResult) <0x41e50000 + 0x0003e> in <filename unknown>:0 
    at Mono.Net.Security.Private.LegacySslStream.AuthenticateAsServer (System.Security.Cryptography.X509Certificates.X509Certificate serverCertificate, Boolean clientCertificateRequired, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation) <0x41e40990 + 0x00055> in <filename unknown>:0 
    at System.Net.HttpConnection.Init() <0x41e3e0e0 + 0x0005f> in <filename unknown>:0 
    at System.Net.HttpConnection..ctor (System.Net.Sockets.Socket sock, System.Net.EndPointListener epl, Boolean secure, System.Security.Cryptography.X509Certificates.X509Certificate cert) <0x41e3b670 + 0x003e7> in <filename unknown>:0 
    at System.Net.EndPointListener.OnAccept (System.Object sender, System.EventArgs e) <0x41e3b210 + 0x002a7> in <filename unknown>:0 
    at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted (System.Net.Sockets.SocketAsyncEventArgs e) <0x41e3b1d0 + 0x0002e> in <filename unknown>:0 
    at System.Net.Sockets.SocketAsyncEventArgs.Complete() <0x41e3b1b0 + 0x00013> in <filename unknown>:0 
    at System.Net.Sockets.Socket.<AcceptAsyncCallback>m__0 (IAsyncResult ares) <0x41e3aa70 + 0x0037f> in <filename unknown>:0 
    at System.Net.Sockets.SocketAsyncResult+<Complete>c__AnonStorey0.<>m__0 (System.Object _) <0x41e3a980 + 0x0001d> in <filename unknown>:0 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() <0x7f22cac25460 + 0x0002f> in <filename unknown>:0 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() <0x7f22cac239e0 + 0x001d6> in <filename unknown>:0 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() <0x7f22cac252e0 + 0x00008> in <filename unknown>:0 

ответ

0

не совсем решение, но я был в состоянии обойти эту проблему путем создания локальный обратный прокси-сервер с nginx и установка моно-сервера для прослушивания только на 127.0.0.1

https://www.nginx.com/resources/admin-guide/reverse-proxy/