2012-11-19 13 views
7

SSL có được hỗ trợ trên Ngăn xếp dịch vụ trên Mono không?SSL trên Ngăn xếp dịch vụ

tôi chỉ có quyền truy cập vào một mac và các hướng dẫn tôi tìm thấy ở đây yêu cầu bạn sử dụng một công cụ cửa sổ để tạo ra một tập tin PVK: http://joshua.perina.com/geo/post/using-ssl-https-with-mono-httplistener

Các trang web được lưu trữ như một quá trình daemon linux sử dụng một kịch bản mới nổi để giữ máy chủ lên.

Trả lời

9

Tôi đã kết thúc viết một số mã trong máy chủ ứng dụng của mình để bật hỗ trợ SSL cho Ngăn xếp dịch vụ, sử dụng HttpListener trong trang bìa. Dưới đây là một số mã sẽ bật SSL cho Ngăn xếp dịch vụ cho ứng dụng bảng điều khiển:

public class AppHost : AppHostHttpListenerBase 
{ 
    public AppHost() : base("Service", typeof(AppHost).Assembly) 
    { 
    } 

    public override void Configure(Funq.Container container) 
    { 
     Plugins.Add(new RazorFormat()); 
    } 

    static void AddP12 (string filename, string password, ushort port) 
    { 
     string dirname = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
     string path = Path.Combine(dirname, ".mono"); 
     path = Path.Combine(path, "httplistener"); 
     if (!Directory.Exists(path)) 
     { 
      Console.WriteLine("Creating directory: " + path); 
      Directory.CreateDirectory(path); 
     } 
     X509Certificate2 x509 = null; 
     try { 
      x509 = new X509Certificate2 (filename, password); 
     } catch (Exception e) { 
      Console.Error.WriteLine ("error loading certificate [{0}]", e.Message); 
      return; 
     } 

     string target_cert = Path.Combine (path, String.Format ("{0}.cer", port)); 
     if (File.Exists(target_cert)) 
     { 
      Console.Error.WriteLine ("error: there is already a certificate for that port."); 
      return; 
     } 
     string target_pvk = Path.Combine (path, String.Format ("{0}.pvk", port)); 
     if (File.Exists(target_pvk)) { 
      Console.Error.WriteLine ("error: there is already a certificate for that port."); 
      return; 
     } 

     using (Stream cer = File.OpenWrite (target_cert)) 
     { 
      byte[] raw = x509.RawData; 
      cer.Write (raw, 0, raw.Length); 
     } 

     PrivateKey pvk = new PrivateKey(); 
     pvk.RSA = x509.PrivateKey as RSA; 
     pvk.Save(target_pvk);   
    } 

    public static void Main(string[] args) 
    { 
     string listeningOn = string.Empty; 
     if (args.Length == 1) 
      listeningOn = "http://*:" + args[0] + "/"; 
     else if (args.Length == 3) 
     { 
      listeningOn = "https://*:" + args[0] + "/"; 
      AddP12(args[1], args[2], Convert.ToUInt16(args[0])); 
     } 
     else 
     { 
      Console.WriteLine("Usage: [port] [p12 certificate] [p12 password]"); 
      return; 
     } 
     AppHost appHost = new AppHost(); 
     appHost.Init(); 
     appHost.Start(listeningOn); 
     Console.WriteLine("Service Stack Server started at {0}, listening on {1}", DateTime.Now, listeningOn); 
     while (true) System.Threading.Thread.Sleep(100); 
    } 
} 
+1

Có vẻ như nó chỉ sao chép chứng từ từ vị trí này sang vị trí khác. Làm thế nào để giúp? Có lẽ cấu hình chứng chỉ trong hệ điều hành cũng được yêu cầu? –