我正在尝试在装有 Windows Server 2012 的服务器上安装自承载 WCF 服务。 我正在按照以下步骤操作:
- 使用 MMC 导入我的 PFX 文件
-
运行"Netsh HTTP add SSLCERT IPPORT=0.0.0.0:49000 certhash=e09280ded2322eb858b38b3250e1a488f797b269 appid={4dc3e181-e14b-4a21-b022-59fc669b0914}">
-
安装我的服务并启动它
起初它工作得很好。但是几个小时后,ssl 崩溃,我只能在客户端收到错误消息,如下所示
mscorlib.dll 中发生了类型为"System.ServiceModel.CommunicationException"的未处理异常。 其他信息:向 https://servername:49000/WCFServiceName 发出 HTTP 请求时出错。这可能是由于在 HTTPS 情况下,服务器证书未使用 HTTP.SYS 正确配置。这也可能是由客户端和服务器之间的安全绑定不匹配引起的。
运行"netsh http delete sslcert ipport=0.0.0.0:49000" 并删除导入的 PFX,然后重做步骤 1 和 2 可以使 SSL 再次工作,但问题仍然会在几个小时后出现。
这绝对不是安全协议问题,因为我已经尝试添加
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
在请求之前。服务器和客户端都使用 .Net Framework 4.5.2
我尝试过"netsh http show sslcert",结果如下:
IP:port : 0.0.0.0:49000
Certificate Hash : e09280ded2322eb858b38b3250e1a488f797b269
Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914}
Certificate Store Name : My
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout : 0
Ctl Identifier : (null)
Ctl Store Name : (null)
DS Mapper Usage : Disabled
Negotiate Client Certificate : Disabled
我尝试删除端口 49000 上的 sslcert 绑定,并在 IIS 中创建了一个绑定到端口 49000 的空网站,然后让我的服务侦听该端口。它第一次工作并持续了大约一周,然后弹出相同的错误。
我应该从哪里开始定位和解决这个有线问题?
首先,我们应该确保 WCF 可以访问证书私钥。网络服务帐户(或每个人帐户)应添加到证书读取/写入器组中,然后我们使用相应的帐户运行应用程序(Windows 服务或控制台?
https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-make-x-509-certificates-accessible-to-wcf
其次,如您所知,TLS 版本需要操作系统和 Dotnetframework 支持,默认协议版本为 ssl3.0/tls1.0(自动协商,无法配置)。我们最好使用最新的操作系统版本和.netframework4.7。我认为这可能是通信不稳定的原因。
请参考以下文档。
https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls 如果问题仍然存在,请随时告诉我。