在MonoTouch上使用Https的HttpListener

9
我使用MonoTouch中的HttpListener实现了一个非常简单的Web服务器,一切都很顺利。现在我需要添加HTTPS支持。我尝试跟随Httplistener with https support中的步骤,但是我不知道在MonoTouch中如何设置证书。仅仅添加前缀"https:// *:443"没有帮助,因为无法建立连接也没有抛出任何异常。根据http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx,这可能是因为必须指定服务器证书(“您可以使用HttpCfg.exe配置服务器证书和其他侦听器选项”)。
我该如何在MonoTouch中做到这一点?
1个回答

7
这是一个非常好的问题。在某些情况下,比如HttpListener,.NET需要使用工具或.config文件(使用System.Configuration)来调整应用程序的配置。在许多情况下,有API可以实现相同的目的,但并不总是(在这种情况下也不是)。
解决方案是查看Mono的源代码,以查看它期望HttpCfg.exe工具为应用程序设置什么。从github中获取:
string dirname = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData);
string path = Path.Combine (dirname, ".mono");
path = Path.Combine (path, "httplistener");
string cert_file = Path.Combine (path, String.Format ("{0}.cer", port));
if (!File.Exists (cert_file))
    return;
string pvk_file = Path.Combine (path, String.Format ("{0}.pvk", port));
if (!File.Exists (pvk_file))
    return;
cert = new X509Certificate2 (cert_file);
key = PrivateKey.CreateFromFile (pvk_file).RSA;

因此,解决方案是创建相同的目录结构(这是可能的,因为它将指向“文档”目录),并复制“.cer”文件(二进制DER编码证书)和“.pvk”文件(它是由“makecert”创建的格式中的私钥),并以端口号作为文件名。
有了这些文件,您应该能够启动“HttpListener”,并加载所需的证书和私钥,以处理SSL请求。

1
为了使其正常工作,<port>.cer 和 <port>.pvk 文件必须驻留在 <应用程序文档目录>/.config/.mono/httplistener 中。 - zmit
谢谢您发布这个问题!我猜您已经在MonoTouch上解决了这个问题?我正在尝试在Monodroid上解决它。我无法弄清楚如何将证书和pvk文件放在正确的位置。我将它们添加为“资产”,但似乎没有起作用。 :-( - exvance
这仅仅是我个人的看法,还是说这违背了 HTTPS 的目的?因为轻而易举地从捆绑包或文件系统中下载私钥。 - borrrden
@exvance,你最终找到存储文件的位置了吗? - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接