【发布时间】: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 枚举来指定要打开的商店。