如何将 SSL 与 HttpListener 与 mkbundle 的 Mono 应用程序一起使用

Coc*_*lla 5 mono ssl httplistener mkbundle servicestack

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

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

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

所以HttpListener在运行时从特定路径加载证书。

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

Sco*_*ott 5

是的,HttpListener期望在其上查找证书的路径是预定义的,用户无法以编程方式或通过配置文件指定。MonoEndPointListener类将查找路径:

~/.config/.mono/httplistener/
Run Code Online (Sandbox Code Playgroud)

HttpListener 代码

~/.config/.mono/httplistener/
Run Code Online (Sandbox Code Playgroud)

正如您所指出的,这与将httpcfg证书复制到的路径相同。

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

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

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

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


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

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

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

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

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