WebRequest由于此错误消息,我们无法连接到HTTPS服务器:
The request was aborted: Could not create SSL/TLS secure channel.
我们知道服务器没有使用路径的有效HTTPS证书,但是为了绕过这个问题,我们使用以下代码,我们从另一个StackOverflow帖子中获取:
private void Somewhere() {
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}
private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
问题是服务器永远不会验证证书并因上述错误而失败.有谁知道我该怎么办?
我应该提到一位同事和我几周前进行了测试,并且它与我上面写的内容类似.我们发现的唯一"主要差异"是我使用的是Windows 7并且他使用的是Windows XP.这有什么改变吗?
我正在从单元测试中追踪臭名昭着的"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.
这肯定是握手失败后加密通道原因的有效原因.