【问题标题】:SSL crashes periodically caused by certificate server certificate is not configured properly with HTTP.SYS由于证书服务器证书未使用 HTTP.SYS 正确配置而导致 SSL 定期崩溃
【发布时间】:2024-01-16 09:41:01
【问题描述】:

我正在尝试在装有 Windows Server 2012 的服务器上安装自托管 WCF 服务。 我按照以下步骤操作:

  1. 用 mmc 导入我的 pfx 文件
  2. 运行“netsh http add sslcert ipport=0.0.0.0:49000 certash=e09280ded2322eb858b38b3250e1a488f797b269 appid={4dc3e181-e14b-4a21-b022-59fc669b0914}”

  3. 安装我的服务并启动它

起初它运作良好。但是几个小时后,ssl 崩溃了,我只能在客户端收到错误消息,如下所示

在 mscorlib.dll 中发生了“System.ServiceModel.CommunicationException”类型的未处理异常。 附加信息:向https://servername:49000/WCFServiceName 发出HTTP 请求时出错。这可能是由于在 HTTPS 情况下未使用 HTTP.SYS 正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

运行“netsh http 删除 sslcert ipport=0.0.0.0:49000” 并删除导入的pfx,然后重做第1步和第2步可以让ssl再次工作,但问题仍然会在几个小时后出现。

肯定不是SecurityProtocol的问题,我已经尝试添加了

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 的空网站绑定,然后让我的服务监听该端口。它第一次工作并持续了大约一周,然后弹出相同的错误。

我应该从哪里开始定位和解决这个有线问题?

【问题讨论】:

    标签: windows wcf ssl certificate


    【解决方案1】:

    首先,我们应该确保证书私钥可以被 WCF 访问。网络服务帐户(或Everyone帐户)应添加到证书READ/Writer组中,然后我们使用相应的帐户运行应用程序(Windows服务或控制台?)。
    https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-make-x-509-certificates-accessible-to-wcf
    其次,如您所知,TLS 版本需要 OS 和 Dotnetframework 支持,默认协议版本为 ssl3.0/tls1.0(自动协商,无法配置)。我们最好使用最新的操作系统版本和.netframework4.7。我认为这可能是通信不稳定的原因。
    请参考以下文档。
    https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
    如果问题仍然存在,请随时告诉我。

    【讨论】:

    • 该服务由系统帐户运行,并具有对读/写证书的完全访问权限。奇怪的是每次我重新安装证书并重新添加 sslcert 服务将正常工作几个小时,然后在客户端出现相同的错误,而服务仍在服务器上运行并且不会抛出任何异常
    • 当调用崩溃时,我们可以使用以下代码检查证书绑定到端口的状态。 netsh http show sslcert ipport=0.0.0.0:9090 另外,尝试更新.netframework版本
    • 我尝试了“netsh http show sslcert”命令,并将它与另一个运行良好的 https 端口进行了比较。事实证明,对于 ipport=0.0.0.0:9090,它显示“证书存储名称:(null)”,但对于一个运行良好的,它显示“证书存储名称:我的”。这似乎是唯一的区别。我应该如何解决这个问题?
    • 我建议我们将证书安装在本地机器证书存储位置而不是当前用户。我们可以使用 Certlm.msc 命令来管理和查看证书。
    • 我已经使用在管理员模式下运行的 mmc 在本地计算机证书存储中重新安装了证书。并得到了相同的结果:安装证书后,我可以先访问我的服务一次,但过一段时间(大约 1 小时)会弹出相同的错误。用“netsh http show sslcert”结果更新了问题。
    最近更新 更多