.net - 支持 HTTPS 的 HttpListener

标签 .net x509certificate httplistener

关于使 .NET HTTPListener 支持 HTTPS,似乎有很多令人困惑、有时甚至相互冲突的信息。我的理解如下:

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

  • 实际的 SSL 握手发生在幕后,并由 http.sys(埋藏在 Windows 计算机上的某个位置)处理。 C# 代码不必显式管理 SSL 握手,因为它发生在幕后。

  • httpListener 计算机上需要有一个“X.509 可信证书”,并且该证书需要以某种方式绑定(bind)到端口 8443(在本例中)。

我上面的理解正确吗?如果不会,请赐教。

关于X.509证书,我的理解是:

  • 使用 makecert 创建 X.509 证书。该证书存储在个人存储中,并且需要移至受信任的存储(这是 HTTP 监听器将查找的位置)。看来我可以使用 certMgr 来执行移动,或者我可以使用 mmc 来实现移动。似乎有不止一种 X.509 证书格式(DERBase64pks、pswd protected、pks > 私有(private)等)...我应该使用首选格式吗?

将证书放入受信任存储区后,我需要将其绑定(bind)到 TCP 端口。我使用的是 Windows 7:我应该使用 httpcfg 还是 netsh

最佳答案

我做了很多功课并且成功了。为 .NET HttpListener 添加 SSL 支持的步骤是:

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

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

    从代码方面来说就是这样。

  2. 对于证书方面,使用 Windows SDK命令控制台或 Visual Studio 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 证书
    • 将证书绑定(bind)到IP地址:端口和应用程序。示例:

      netsh http add sslcert ipport=0.0.0.0:8443 certhash=585947f104b5bce53239f02d1c6fed06832f47dc appid={df8c8073-5a4b-4810-b469-5975a9c95230}
      

      certhash 是您的 SSL 证书的指纹。您可以使用 mmc 找到它。 appid 可在 Visual Studio 中找到...通常在 assembly.cs 中,查找 GUID 值。

可能还有其他方法可以完成上述任务,但这对我有用。

关于.net - 支持 HTTPS 的 HttpListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11403333/

相关文章:

java - 来自 CA 的 PKCS12 Java keystore 和 Java 中的用户证书

node.js - 使用 Nodejs over SOAP 和 x509 证书对 Microsoft EWS 进行身份验证

c# - 如何使用 HttpListener 同时处理多个连接?

iis-7 - 关于 HTTP.SYS 和 SSL 流量的问题

c# - .NET HttpListener/HttpWebRequest/HttpWebResponse 和 HTTPS

c# - 在非托管 C++ 项目中使用 C# COM -> 0x7697C41F (KernelBase.dll) 处的第一次异常

c# - 在C#中自动神奇地添加MySQL参数

x509certificate - Pvk2Pfx 不会使用输入 PVK 密码进行输出 PFX 保护

c# - 对子对象的 yield 返回

c# - 如何从 .net 中 wwwroot 内的多个文件夹提供 html 文件