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证书格式(DER
,Base64
,pks
,pswd保护pks
私人等)。是否有一个首选的格式,我应该使用?
一旦我将证书放入可信存储区,我需要将其绑定到tcp端口。 我在Win7上:我应该使用httpcfg
还是netsh
?
任何提示/build议,将不胜感激。
我做了一堆作业,并得到这个工作。 为.NET HttpListener添加SSL支持的步骤如下:
-
更新C#应用程序代码以包含https前缀。 例
String[] prefixes = { "http://*:8089/","https://*:8443/" };
这是从代码方面。
-
对于证书方面的东西,使用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上使用openssl
为C#
HTTPListener
应用程序创build自签名证书的独立服务器的详细步骤。 它包括大量的链接,以防你想做进一步的研究。
-
通过
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();
-
创build自签名证书: *
-
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
,它会提示你input命令行中每个证书字段的值。 对于通用名称,input域名(例如localhost
) -
openssl pkcs12 -inkey bob_key.pem -in bob_cert.cert -export -out bob_pfx.pfx
,这样它就可以用目标机器上的密钥导入。
*有关使用
makecert
的替代方法,请参阅Walter自己的答案 。 -
-
打开本地计算机的证书pipe理器。 当您运行
certmgr.msc
,它会打开当前用户的证书pipe理器,这不是我们想要的。 代替:- 从目标机器上的pipe理命令提示符运行
mmc
- 按Ctrl + M ,或单击文件 > 添加/删除pipe理单元
- select
Certificates
,然后单击添加> - 在出现的对话框中,select
Computer Account
,然后单击下一步 - select
Local Computer
。 点击完成 ,然后好的
- 从目标机器上的pipe理命令提示符运行
-
将证书(
pfx
)导入目标计算机上的Windows证书存储区- 在之前打开的
mmc
窗口中,深入到证书(本地计算机) > 个人 - 右键点击
Personal
,然后点击所有任务 - > 导入... - 在出现的对话框的第二个屏幕中,find并导入您的证书。 您必须将文件typesfilter更改为
Personal Information Exchange
或All Files
才能find它 - 在下一个屏幕上,input您在步骤2.1中select的密码,并密切注意第一个checkbox。 这决定了证书的存储安全程度,以及使用的方便程度
- 在最后一个屏幕上,select
Place all certificates in the following store
。 validation它是否为Personal
,然后单击Finish - 重复上面的“
Trusted Root Certification Authorities
证书”部分的导入过程。
- 在之前打开的
-
为您的应用程序创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接口,从这个问题及其答案来判断)
-
-
-
启动你的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:
- 安装IIS(通过Windows上的function),在IIS中创build一个网站,并分配主机名。 也做一个安全的(443端口)的网站。
- 运行letsencrypt-win-simple exe(我使用1.9.1版本)。 回答问题让它生成证书。
- 之后,您可以停止de IIS服务器。
我相信你必须记下产生的刷新任务,因为我不确定它会在几个月后成功(你可能不得不再次启动IIS来更新证书)。