如何使用带有mkbundle'd Mono应用程序的HttpListener SSL

时间:2014-04-23 11:40:54

标签: ssl mono servicestack httplistener mkbundle

我有一个使用Mono构建的.NET应用程序,我使用mkbundle捆绑到本机(Linux)可执行文件中。这样最终用户就不需要乱搞并自己安装Mono。

该应用程序使用ServiceStack,它使用HttpListener。我需要通过启用SSL的HTTP端点公开Web服务。

通常,您会在配置期间运行类似httpcfg -add -port 1234 -p12 MyCert.pfx -pwd "MyPass"的内容(所有这一切都是将证书复制到特定路径),HttpListener会自动将证书绑定到端口。

因此HttpListener在运行时从特定路径加载证书。

该路径是否经过硬编码?或者有什么方法可以告诉它使用来自其他位置的证书,因为最终用户不会安装Mono?

1 个答案:

答案 0 :(得分:3)

HttpListener期望查找证书的路径是预定义的,并且不能由用户以编程方式或通过配置文件指定。 Mono EndPointListener类将查找路径:

~/.config/.mono/httplistener/

HttpListener code

string dirname = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData);
string path = Path.Combine (dirname, ".mono");
path = Path.Combine (path, "httplistener");

正如您所知,这是httpcfg将证书复制到的路径。

即使您正在使用mkbundle,这仍然是HttpListener期望从中读取证书的地方,无论是否安装了Mono运行时。

在您的应用程序启动中,您应该:

  • 检查目录是否存在,并根据需要创建
  • 将证书和密钥从应用程序中的嵌入资源写入该路径。 PouPou's answer here显示了HttpCfg.exe使用的方法。

因此,无需运行httpcfg,您将有效地将该功能直接构建到您的应用程序中。


  

对于HttpListener,Mono是否对其加载的证书进行了任何验证?是否期望在证书商店中找到发行人的证书?

我不确定Mono是否在创建侦听器时或在每个连接请求时在证书存储区中检查有效的相应颁发者证书。但是,您可以自己将CA证书添加到证书存储区,或者导入所有标准Mozroot证书。

Mozroots is here的完整源代码。这显示了如何导入CA证书。

  

证书存储区的路径是否也是硬编码的?

应通过X509StoreManager提供商管理证书存储区。