【问题标题】:"Could not create SSL/TLS secure channel" even though SCHANNEL reports "An SSL server handshake completed successfully."“无法创建 SSL/TLS 安全通道”,即使 SCHANNEL 报告“SSL 服务器握手已成功完成”。
【发布时间】:2016-04-03 23:54:54
【问题描述】:

我正在从单元测试中追踪臭名昭著的“SSL 异常”——在 ReSharper 下运行测试、我帐户下的控制台中的 nunit 以及构建服务器集成测试中都会生成相同的异常。在本地,代码在安装了 .NET 4.5.1 的 Windows 7 机器上运行。

System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道。

我相当肯定它与证书没有严格相关,尽管它们最近已更新。 (失败的确切时间很接近,但不确定 - 另一方面,这不同环境中最有可能发生的相关变化。)

IIS 设置为需要客户端证书,并且与同一端点的 HTTPS 连接在 Chrome 中为“绿色”。如果我在 Chrome 中选择了无效的客户端证书,我会通过成功创建的 HTTPS 连接收到来自 IIS 的 403 消息。

问题:

  • 为什么(如何)在“握手成功完成”后安全 SSL/TLS 通道创建失败?

  • HTTP 403 Forbidden 状态响应以及可能的 WebClient 处理是否是一个因素?如果没有,可以放弃这条查询路径。

  • 调试问题的下一步是什么?初始协商后是否有特定的可监控事件指示成功(或失败)?


以下是在消除其他帖子中发现的问题时收集的内容:

  • 这是异常树的结尾; 没有内部“根据验证程序,远程证书无效”异常,这是我希望出现证书错误的情况。

  • 启用 SCHANNEL 的“所有日志记录”后,服务器会显示

    SSL 服务器握手成功完成。协商的 密码参数如下。

    协议:TLS 1.0 / CipherSuite:0x5 / 交换强度:2048

  • 来自失败单元测试的 SSL 握手/协商在 Wireshark 上“看起来成功”。 (它与 Chrome 请求不同,并且具有不同的协商 CipherSuite。)

  • HTTP 客户端超时时间为 100 秒,应该是默认值。


有点好笑,第一个失败的测试是ShouldCompleteSslHandshakeFor[InvalidClientCert]


更新:查看本地机器的事件查看器后(不要问我为什么会发生这种情况)有失败连接的相应条目:

(SCHANNEL) 尝试访问 SSL 客户端凭据私钥时发生致命错误。从加密模块返回的错误代码是 0x8009030d。内部错误状态为 10003。

这绝对是握手后加密通道失败的一个正当理由。

【问题讨论】:

  • webclient 进程是否有权访问客户端证书的私钥? (在 MMC 控制台中右键单击您的证书 -> 所有任务 -> 管理私钥)。
  • @Alex 我刚刚在本地事件查看器中发现了错误,所以我认为肯定是这样的 - 我现在正在尝试。
  • @Alex 我们有一个赢家(谢谢)!只有管​​理员有权访问;授予所有本地用户读取权限 (=^_^=) 修复了异常。现在我有一些东西可以去 OPs。我还想知道读取客户端证书的代码是否不是最好的。我本以为它会首先在我的个人商店中使用这些证书,而在这两个地方都有它们让我蒙上了一层阴影。
  • 很高兴我能帮上忙 :),您可以通过在实例化 X509Store 对象时提供 StoreLocation 枚举来指定要打开的商店。

标签: .net https webclient


【解决方案1】:

确保访问客户端证书的进程可以访问证书的私钥。

带有证书插件的MMC控制台->右键单击指定的 证书 -> 所有任务 -> 管理私钥。

【讨论】:

  • 这确实是问题所在。今日课程:还要查看本地频道(和其他事件)日志。
【解决方案2】:

回答我的问题:

为什么(如何)在“握手成功完成”后安全 SSL/TLS 通道创建失败?

在握手/协商阶段之后,安全通道加密仍然会失败,该阶段仅决定使用什么证书/加密。在这种情况下,这是因为由于安全限制,私钥(在客户端证书上)不可用。

HTTP 403 Forbidden 状态响应以及可能的 WebClient 处理是否是一个因素?如果没有,可以放弃这条查询路径。

没有。该错误是由 SSL/TLS 加密失败引起的,甚至在调用服务器处理程序之前。这是一个被误导的问题。

调试问题的下一步是什么?初始协商后是否有特定的可监控事件来指示成功(或失败)?

查看相关事件日志 - 在本例中是 本地 机器的 schannel 日志,其中报告了严重错误消息。如果enabling tracing as discussed here,很可能也会发现错误。

【讨论】:

    【解决方案3】:

    我在这里尝试了所有相同的消息,结果证明需要将 MachineKeys 文件夹 (C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys) 的安全权限授予服务器上的用户。 MSDN article with common solutions to this problem

    【讨论】:

      猜你喜欢
      • 2012-11-04
      • 1970-01-01
      • 2021-12-13
      • 2014-12-26
      • 2017-02-10
      • 2017-08-22
      • 2016-08-03
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多