5

我有一个使用 Mono 构建的 .NET 应用程序,我已经使用mkbundle. 这样最终用户就不需要自己动手安装 Mono。

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

通常,您会httpcfg -add -port 1234 -p12 MyCert.pfx -pwd "MyPass"在配置期间运行类似的操作(实际上所做的只是将证书复制到特定路径),并HttpListener自动将证书绑定到端口。

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

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

4

1 回答 1

5

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

~/.config/.mono/httplistener/

HttpListener 代码

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

正如您所注意到的,这是将httpcfg证书复制到的相同路径。

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

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

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

因此,消除了 run 的需求httpcfg,您将有效地将该功能直接构建到您的应用程序中。


Mono 是否对其从那里为 HttpListener 加载的证书执行任何验证?即,它会期望在证书存储中找到颁发者的证书吗?

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

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

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

证书存储应通过X509StoreManager提供程序进行管理。

于 2014-04-23T13:27:23.287 回答