Httplistener与https支持

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

  • 一个人的C#代码需要一个https前缀(例如https://*:8443 ),以便侦听者明白它需要在此端口上处理SSL请求。

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

  • 一个需要在httpListener机器上有一个“x509受信任的证书”,并且不知何故该证书需要被绑定到端口8443(在这个例子中)

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

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

  • 使用makecert创build一个x509证书。 该证书存储在个人存储中,需要移动到Trusted Store(这是http侦听器的外观)。 似乎我可以使用certMgr来执行移动,或者我可以使用mmc来实现移动。 似乎有超过1 x509证书格式( DERBase64pks ,pswd保护pks私人等)。是否有一个首选的格式,我应该使用?

一旦我将证书放入可信存储区,我需要将其绑定到tcp端口。 我在Win7上:我应该使用httpcfg还是netsh

任何提示/build议,将不胜感激。

我做了一堆作业,并得到这个工作。 为.NET HttpListener添加SSL支持的步骤如下:

  1. 更新C#应用程序代码以包含https前缀。 例

     String[] prefixes = { "http://*:8089/","https://*:8443/" }; 

    这是从代码方面。

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

    • 使用makecert.exe创build证书颁发机构。 例:

       makecert -n "CN=vMargeCA" -r -sv vMargeCA.pvk vMargeCA.cer 
    • 使用makecert.exe创build一个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={df8c8073-5a4b-4810-b469-5975a9c95230}

      certhash是您的ssl证书的指纹。 你可以使用mmcfind这个appid在VS中find…通常在assembly.cs中findguid值

可能有其他的方法来完成上述,但是这对我有效。

以下是我在Windows上使用opensslC# HTTPListener应用程序创build自签名证书的独立服务器的详细步骤。 它包括大量的链接,以防你想做进一步的研究。

  1. 通过HttpListener.NET创build一个独立的服务器:

     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(); 
  2. 创build自签名证书: *

    1. openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 ,它会提示你input命令行中每个证书字段的值。 对于通用名称,input域名(例如localhost
    2. openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx ,这样它就可以用目标机器上的密钥导入。

    *有关使用makecert的替代方法,请参阅Walter自己的答案 。

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

    1. 从目标机器上的pipe理命令提示符运行mmc
    2. Ctrl + M ,或单击文件 > 添加/删除pipe理单元
    3. selectCertificates ,然后单击添加>
    4. 在出现的对话框中,selectComputer Account ,然后单击下一步
    5. selectLocal Computer 。 点击完成 ,然后好的
  4. 将证书( pfx )导入目标计算机上的Windows证书存储区

    1. 在之前打开的mmc窗口中,深入到证书(本地计算机) > 个人
    2. 右键点击Personal ,然后点击所有任务 - > 导入...
    3. 在出现的对话框的第二个屏幕中,find并导入您的证书。 您必须将文件typesfilter更改为Personal Information ExchangeAll Files才能find它
    4. 在下一个屏幕上,input您在步骤2.1中select的密码,并密切注意第一个checkbox。 这决定了证书的存储安全程度,以及使用的方便程度
    5. 在最后一个屏幕上,selectPlace all certificates in the following store 。 validation它是否为Personal ,然后单击Finish
    6. 重复上面的“ Trusted Root Certification Authorities证书”部分的导入过程。
  5. 为您的应用程序创build端口关联。 在Windows Vista和更高版本上,像我一样使用netsh 。 (对于Windows XP和更早版本,请使用httpcfg

    • 在pipe理命令行中,键入以下内容以设置您的应用程序的SSL绑定以及适当的端口。 注意:这个命令很容易出错 ,因为(在PowerShell中)大括号需要被转义 。 以下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绑定到每个networking接口上的端口8443 ; 要绑定到特定的接口(仅),请select与该networking接口关联的IP地址。
      • certhash只是证书指纹,删除了空格
      • appid是存储在应用程序的Assembly Info中的GUID。 (旁注: netsh机制显然是一个COM接口,从这个问题及其答案来判断)
  6. 启动你的networking服务器,你很好走!

由于在答案中制作自己的自签名证书并不适用于我,因为这个问题明确地要求提供.net HTTPListener httpsfunction,并要求提供任何提示/build议,所以我想分享我的方法。您需要一个主机名,像www.made-up.com需要指向您的WAN IP(例如询问您的主机提供商的说明),并将其端口(例如443)转发到您的本地计算机。不要忘记在防火墙中打开入站443端口你的本地机器。

我用https://letsencrypt.org/ 。 在Windows上,这并不像在Linux上那么容易,因为没有官方的Certbot ACME客户端用于Windows。 但是你可以使用https://github.com/Lone-Coder/letsencrypt-win-simple ,其中也有二进制文件。 但是“目前只支持IIS”。 但是,您可以轻易欺骗它在您的计算机上创build证书,以便您可以使用SSL方式访问您的httplistener:

  1. 安装IIS(通过Windows上的function),在IIS中创build一个网站,并分配主机名。 也做一个安全的(443端口)的网站。
  2. 运行letsencrypt-win-simple exe(我使用1.9.1版本)。 回答问题让它生成证书。
  3. 之后,您可以停止de IIS服务器。

我相信你必须记下产生的刷新任务,因为我不确定它会在几个月后成功(你可能不得不再次启动IIS来更新证书)。