关于如何使.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证书格式(DER
、Base64
、pks
、受pswd保护、pks
专用等)...是否有我应该使用的首选格式?
将证书放入受信任存储区后,我需要将其绑定到TCP端口。我使用的是Windows 7:我应该使用httpcfg
还是netsh
?
5条答案
按热度按时间r8xiu3jd1#
我做了一大堆家庭作业,让这个工作。为.NET HttpListener添加SSL支持的步骤是:
1.更新C#应用程序代码以包含
https
前缀。示例:从代码方面来说就是这样。
makecert.exe
创建证书颁发机构。示例:makecert.exe
创建SSL证书IP address:port
和应用程序。示例:certhash是来自SSL证书的指纹。您可以使用mmc找到它。appid在Visual Studio中找到...通常在assembly.cs中,请查找GUID值。
也许还有其他方法可以实现上述目标,但这对我很有效。
7lrncoxx2#
以下是我在Windows上设置独立服务器的详细步骤,使用OpenSSL为C#
HTTPListener
应用程序创建自签名证书。它包含大量链接,以备您进一步研究。1.通过
HttpListener
在.NET中创建独立服务器:1.创建自签名证书:*
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。1.打开本地计算机的证书管理器。当您运行
certmgr.msc
时,它会为 * 当前用户 * 打开证书管理器,这不是我们在这里想要的。请改为运行certlm.msc
[Thanks,@Arkane],如果该操作不起作用,则:1.在目标计算机的管理命令提示符下,运行
mmc
1.按Ctrl + M,或单击“文件”〉“添加/删除管理单元
1.选择
Certificates
,然后单击添加〉1.在出现的对话框中,选择
Computer Account
,然后单击“下一步1.选择
Local Computer
。单击完成,然后单击确定1.将证书(
pfx
)导入目标计算机上的Windows Certificate Store1.在之前打开的
mmc
窗口中,深入查看“Certificates(Local Computer)”〉“Personal1.右键单击
Personal
,然后单击所有任务-〉导入...1.在出现的对话框的第二个屏幕中,查找并导入您的证书。您必须将文件类型过滤器更改为
Personal Information Exchange
或All Files
才能找到它1.在下一个屏幕上,输入您在步骤2.1中选择的密码,并密切注意第一个复选框。这将决定您的证书存储的安全程度以及使用的方便程度
1.在最后一个屏幕上,选择
Place all certificates in the following store
。验证它是否为Personal
,然后单击Finish1.对
Trusted Root Certification Authorities
证书部分重复上述导入过程。1.为您的应用程序创建端口关联。在Windows Vista和更高版本上,使用
netsh
,就像我所做的那样。(对于Windows XP和更低版本,使用httpcfg
)对于
cmd.exe
,应改为使用以下代码:ipport
参数将使SSL证书绑定到每个网络接口上的端口8443
;要(仅)绑定到特定接口,请选择与该网络接口关联的IP地址。certhash
只是证书指纹,去掉了空格appid
是存储在应用程序的程序集信息中的GUID。从question及其答案判断,netsh
机制显然是一个COM接口)1.启动你的网络服务器,你就可以开始了!
bqujaahr3#
我们可以使用PowerShell和C#导入证书(无需手动步骤)。
有关详细信息,请参阅:https://blog.davidchristiansen.com/2016/09/howto-create-self-signed-certificates-with-powershell/
我用这个代码:
需要PowerShell 4或更高版本。
zvokhttg4#
以下命令为localhost生成10年的自签名证书,将其导入本地计算机存储并在输出中显示Thumbprint(certhash):
然后,您可以从输出中复制指纹,并使用netsh.exe将证书附加到localhost:443,例如:
适用于Windows 8或更高版本。需要管理员权限。
zsbz8rwp5#
由于在答案中制作自己的自签名证书对我不起作用,而且这个问题特别要求制作一个.NET HTTPListener HTTPS功能,并要求任何提示/建议,我想分享我的方法。
您需要一个主机名,例如www.made-up.com,它需要指向您的广域网IP地址(例如向您的主机提供商寻求指导),并将其端口(例如443)转发到您的本地计算机。不要忘记在您本地计算机的防火墙中打开入站443端口。
我使用https://letsencrypt.org/。在Windows上这不像在Linux上那么容易,因为没有任何官方的certbot ACME客户端。但是,你可以使用https://github.com/Lone-Coder/letsencrypt-win-simple,它也有二进制文件。但是“目前只支持IIS”。但是你可以很容易地欺骗它在你的计算机上创建一个证书,这样你就可以通过SSL方式访问你的HTTP侦听器:
1.安装IIS(通过Windows Features on/of),在IIS中创建一个网站并指定主机名。同时创建一个安全的(443端口)网站。
1.运行letsencrypt-win-simple EXE文件(我使用的是1.9.1版本),回答下面的问题,让它生成证书。
1.之后,您可以停止de IIS服务器.
我相信您必须注意生成的刷新任务,因为我不确定它在几个月后是否会成功(您可能必须再次启动IIS才能续订证书)。