关于做出决定,似乎有很多令人困惑的信息,有时是相互矛盾的.NET HTTPListener支持HTTPS.我的理解如下:

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

  • 实际的SSL握手发生在幕后,由http.sys处理(隐藏在Windows机器上的某个地方).C#代码不必显式管理SSL握手,因为它是在幕后进行的.

  • httpListener机器上需要有一个"X.509受信任证书",并且该证书需要以某种方式绑定到端口8443(在本例中).

我以上的理解正确吗?如果没有,请教育我.

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

  • 使用makecert创建X.509证书.此证书存储在个人存储区中,需要移到受信任的存储区(这是HTTP侦听器将查看的位置).似乎我可以使用certMgr来执行移动,或者我可以使用mmc来实现移动.似乎有不止一种X.509证书格式(DERBase64pks、pswd保护、pks私有等)……有没有我应该使用的首选格式?

Once I get the certificate into the trusted store, I need to bind it to the TCP port. I am on Windows 7: should I be using httpcfg or netsh?

推荐答案

我做了一大堆家庭作业(job),让它运转起来.添加SSL支持的步骤.NET HttpListener是:

  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在可信机构存储中安装CA

    • 使用MMC GUI在个人存储中安装SSL证书
    • 将证书绑定到IP address:port和apply.示例:

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

      certhash是SSL证书上的 fingerprint .你可以用mmc找到这个.

也许还有其他方法可以实现上述目标,但这对我来说很管用.

.net相关问答推荐

使用PowerShell在Windows容器内安装exe

CLR如何在后台优化布尔比较操作?

如何运行大量阻塞/同步 I/O 操作

.net Maui 在单击按钮时访问 CollectionView 中的数据项

在一个 LINQ 查询中获取两列的总和

将 int 转换为 .NET 中的位数组

ICommand MVVM 实现

XmlNode 值与内部文本

如何将 UI Dispatcher 传递给 ViewModel

如何使用反射在 .NET 中调用重载方法

我们应该总是在类中包含一个默认构造函数吗?

Dapper 是否支持 SQL 2008 表值参数?

将两个列表映射到 C# 中的字典中

Environment.GetFolderPath(...CommonApplicationData) 在 Vista 上仍然返回C:\Documents and Settings\

在 WPF DataGrid 中绑定 ComboBoxColumn 的 ItemsSource

为什么甚至可以更改私有成员,或使用反射在 C# 中运行私有方法?

DataContractSerializer vs XmlSerializer:每个序列化器的优缺点

找不到 System.Windows.Media 命名空间?

使用 C# vs F# 或 F# vs C# 有什么好处?

Uri.Host 和 Uri.Authority 有什么区别