我正在从单元测试中追踪臭名昭着的"SSL异常" - 在ReSharper下运行测试,从我帐户下的控制台运行nunit,以及在构建服务器集成测试中生成相同的异常.在本地,代码是从安装了.NET 4.5.1的Windows 7计算机运行的.
System.Net.WebException:请求已中止:无法创建SSL/TLS安全通道.
我相当肯定它与证书并不严格相关,尽管它们最近已经更新.(失败的确切时间是接近但不明确的 - 另一方面,这是不同环境中最有可能发生的相关变化.)
IIS设置为需要客户端证书,并且与Chrome相同端点的HTTPS连接为"绿色".如果我在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.
这肯定是握手失败后加密通道原因的有效原因.
确保访问客户端证书的进程可以访问证书的私钥.
带有证书插件的MMC控制台 - >右键单击指定的证书 - >所有任务 - >管理私钥.