首页 文章

Httplistener支持https

提问于
浏览
53

似乎有很多令人困惑的,有时是冲突的信息,关于使.net HTTPListener https能够 . 我的理解如下:

  • 一个人的c#代码需要一个 https 前缀(例如 https://*:8443 ),以便监听器了解它需要在此端口上为SSL请求提供服务 .

  • 实际的SSL握手发生在幕后,由 http.sys 处理(埋在Windows机器的某处); C#代码不必显式管理ssl握手,因为它发生在封面下 .

  • 需要在 httpListener 机器上有"x509 trusted certificate",并且某种程度上证书需要绑定到端口8443(在此示例中)

我的理解是否正确?如果没有,请教育我 .

关于x509证书,我的理解是:

  • 使用 makecert 创建x509证书 . 此证书存储在个人存储中,需要转移到受信任存储(这是http侦听器所在的位置) . 似乎我可以使用 certMgr 来执行移动,或者我可以使用 mmc 来实现移动 . 似乎有超过1 x509证书格式( DERBase64pks ,pswd受保护 pks 私有等)..我应该使用首选格式吗?

一旦我将证书带入可信商店,我需要将其绑定到tcp端口 . 我在Win7上:我应该使用 httpcfg 还是 netsh

任何提示/建议将不胜感激 .

3 回答

  • 73

    以下是我在Windows上设置独立服务器的详细步骤,使用 opensslC# HTTPListener 应用程序创建自签名证书 . 如果您想进一步研究,它包含大量链接 .

    • 通过 HttpListener.NET 中创建独立服务器:
    var prefixes = {"http://localhost:8080/app/root", "https://localhost:8443/app/root"};
    var listener = new HttpListener();
    foreach (string s in prefixes)
        listener.Prefixes.Add(s);
    listener.Start();
    

    *有关使用 makecert 的替代方案,请参阅Walter自己的answer .

    • 打开本地计算机的证书管理器 . 当您运行 certmgr.msc 时,它会打开当前用户的证书管理器,这不是我们想要的 . 代替:

    • 从目标计算机上的管理命令提示符处,运行 mmc

    • 按Ctrl M,或单击“文件”>“添加/删除管理单元”

    • 选择 Certificates ,然后单击添加>

    • 在出现的对话框中,选择 Computer Account ,然后单击“下一步”

    • 选择 Local Computer . 单击Finish,然后单击Okay

    • 将证书( pfx )导入目标计算机上的Windows Certificate Store

    • 在之前打开的 mmc 窗口中,深入查看“证书(本地计算机)”>“个人”

    • 右键单击 Personal ,然后单击所有任务 - >导入...

    • 在出现的对话框的第二个屏幕中,查找并导入证书 . 您必须将文件类型过滤器更改为 Personal Information ExchangeAll Files 才能找到它

    • 在下一个屏幕上,输入您在步骤2.1中选择的密码,并密切注意第一个复选框 . 这决定了您的证书的存储安全性,以及它的使用方便程度

    • 在最后一个屏幕上,选择 Place all certificates in the following store . 验证它是否显示 Personal ,然后单击“完成”

    • Trusted Root Certification Authorities 证书部分重复上面的导入过程 .

    • 为您的应用程序创建端口关联 . 在Windows Vista和更高版本中,像我一样使用 netsh . (对于Windows XP和更早版本,请使用 httpcfg

    • 在管理命令行中,键入以下内容以将SSL binding *设置为您的应用程序以及相应的端口 . NB: 此命令是easy to get wrong,因为(在PowerShell中)大括号需要escaped . 以下PowerShell命令将起作用:

    netsh http add sslcert ipport=0.0.0.0:8443 `
        certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 `
        appid=`{00112233-4455-6677-8899-AABBCCDDEEFF`}
    

    对于 cmd.exe ,应使用以下内容:

    netsh http add sslcert ipport=0.0.0.0:8443 certhash=110000000000003ed9cd0c315bbb6dc1c08da5e6 appid={00112233-4455-6677-8899-AABBCCDDEEFF}
    
    • ipport 参数将导致ssl cert绑定到每个网络接口上的端口 8443 ;要绑定到特定接口(仅限),请选择与该网络接口关联的IP地址 .

    • certhash 只是证书指纹,删除了空格

    • appid 是存储在应用程序的程序集信息中的GUID . (旁注: netsh 机制显然是一个COM接口,从这个question及其答案判断)

    • Microsoft已将SSL绑定链接从here重定向到there .
    • 启动您的网络服务器,你很高兴!
  • 28

    我做了一大堆功课,让这个工作 . 为.NET HttpListener添加SSL支持的步骤如下:

    • 更新C#应用代码以包含https前缀 . 例
    String[] prefixes = { "http://*:8089/","https://*:8443/" };
    

    从代码方面来看就是这样 .

    • 对于证书方面的东西,使用Win SDK命令控制台(也可以使用VS Professional命令控制台)

    • 使用 makecert.exe 创建一个证书颁发机构 . 例:

    makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer
    
    • 使用 makecert.exe 创建SSL证书

    makecert -sk vMargeSignedByCA -iv vMargeCA.pvk -n“CN = vMargeSignedByCA”-ic vMargeCA.cer vMargeSignedByCA.cer -sr localmachine -ss My

    • 使用MMC GUI在Trusted Authority存储中安装CA.

    • 使用MMC GUI在个人存储中安装ssl证书

    • 将证书绑定到ip:端口和应用程序 . 例:

    netsh http add sslcert ipport = 0.0.0.0:8443 certhash = 585947f104b5bce53239f02d1c6fed06832f47dc appid =

    certhash是来自ssl证书的指纹 . 你可以使用mmc找到这个appid在VS中找到...通常在assembly.cs中,寻找guid值

    可能还有其他方法可以实现上述目标,但这对我有用 .

  • 1

    由于在答案中制作自己的自签名证书对我不起作用,因为问题特别要求使.net HTTPListener https能够并且要求任何提示/建议,我想分享我的方法 . 你需要一个主机名,一些东西比如www.made-up.com需要指向您的WAN IP(例如询问您的主机提供商的说明)并转发其端口,例如443到您的本地计算机 . 不要忘记打开本地计算机防火墙中的入站443端口 .

    我用https://letsencrypt.org/ . 在Windows上这不像在Linux上那么容易,因为Windows没有官方的certbot ACME客户端 . 但是你可以使用https://github.com/Lone-Coder/letsencrypt-win-simple,其中也有二进制文件 . 但是"Currently only IIS is supported" . 但您可以轻松地欺骗它在您的计算机上创建证书,以便您可以通过SSL方式接近httplistener:

    • 安装IIS(通过/上的Windows功能),在IIS中创建一个网站并分配主机名 . 还要 Build 一个安全的(443端口)网站 .

    • 运行letsencrypt-win-simple exe(我使用的是1.9.1版本) . 回答问题,让它生成证书 .

    • 之后,您可以停止de IIS服务器 .

    我相信您必须注意生成的刷新任务,因为我不确定它会在几个月后成功(您可能必须再次启动IIS才能续订证书) .

相关问题