似乎有很多令人困惑的,有时是冲突的信息,关于使.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证书格式(DER
,Base64
,pks
,pswd受保护pks
私有等)..我应该使用首选格式吗?
一旦我将证书带入可信商店,我需要将其绑定到tcp端口 . 我在Win7上:我应该使用 httpcfg
还是 netsh
?
任何提示/建议将不胜感激 .
3 回答
以下是我在Windows上设置独立服务器的详细步骤,使用
openssl
为C#
HTTPListener
应用程序创建自签名证书 . 如果您想进一步研究,它包含大量链接 .HttpListener
在.NET
中创建独立服务器:创建自签名证书:*
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365,它将提示您输入命令行上每个证书字段的值 . 对于公用名,请键入域名(例如
localhost
)openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx,以便可以在目标计算机上将其键导入 .
*有关使用
makecert
的替代方案,请参阅Walter自己的answer .打开本地计算机的证书管理器 . 当您运行
certmgr.msc
时,它会打开当前用户的证书管理器,这不是我们想要的 . 代替:从目标计算机上的管理命令提示符处,运行
mmc
按Ctrl M,或单击“文件”>“添加/删除管理单元”
选择
Certificates
,然后单击添加>在出现的对话框中,选择
Computer Account
,然后单击“下一步”选择
Local Computer
. 单击Finish,然后单击Okay将证书(
pfx
)导入目标计算机上的Windows Certificate Store在之前打开的
mmc
窗口中,深入查看“证书(本地计算机)”>“个人”右键单击
Personal
,然后单击所有任务 - >导入...在出现的对话框的第二个屏幕中,查找并导入证书 . 您必须将文件类型过滤器更改为
Personal Information Exchange
或All 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命令将起作用:
对于
cmd.exe
,应使用以下内容:ipport
参数将导致ssl cert绑定到每个网络接口上的端口8443
;要绑定到特定接口(仅限),请选择与该网络接口关联的IP地址 .certhash
只是证书指纹,删除了空格appid
是存储在应用程序的程序集信息中的GUID . (旁注:netsh
机制显然是一个COM接口,从这个question及其答案判断)我做了一大堆功课,让这个工作 . 为.NET HttpListener添加SSL支持的步骤如下:
从代码方面来看就是这样 .
对于证书方面的东西,使用Win SDK命令控制台(也可以使用VS Professional命令控制台)
使用
makecert.exe
创建一个证书颁发机构 . 例:makecert.exe
创建SSL证书使用MMC GUI在Trusted Authority存储中安装CA.
使用MMC GUI在个人存储中安装ssl证书
将证书绑定到ip:端口和应用程序 . 例:
certhash是来自ssl证书的指纹 . 你可以使用mmc找到这个appid在VS中找到...通常在assembly.cs中,寻找guid值
可能还有其他方法可以实现上述目标,但这对我有用 .
由于在答案中制作自己的自签名证书对我不起作用,因为问题特别要求使.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才能续订证书) .