该请求被中止:无法创buildSSL / TLS安全通道
由于此错误消息,我们无法使用WebRequest
连接到HTTPS服务器:
The request was aborted: Could not create SSL/TLS secure channel.
我们知道服务器没有使用有效的HTTPS证书,但为了绕过这个问题,我们使用了我们从另一个StackOverflow文章中获得的以下代码:
private void Somewhere() { ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AllwaysGoodCertificate); } private static bool AllwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) { return true; }
问题是服务器从不validation证书,并失败,出现上述错误。 有谁知道我该怎么做?
我应该提到,几个星期前我和一个同事进行了testing,而且在我上面写的东西类似的情况下工作正常。 我们发现唯一的“主要区别”是我使用的是Windows 7,他使用的是Windows XP。 这会改变什么吗?
我终于find了答案(我没有注意到我的来源,但它是来自search)。
虽然代码在Windows XP中工作,但在Windows 7中,您必须在开始处添加此代码:
ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // Use SecurityProtocolType.Ssl3 if needed for compatibility reasons
而现在,它完美的作品。
附录
正如罗宾法语所提到的那样; PayPal不再支持SSL3,所以你需要使用TLS1.2。 贝宝信息页
您遇到的问题是aspnet用户无权访问证书。 您必须使用winhttpcertcfg.exe访问权限
有关如何设置的示例如下: http : //support.microsoft.com/kb/901183
在步骤2中更多信息
编辑:在更新版本的IIS中,此function内置于证书pipe理器工具中 – 可通过右键单击证书并使用pipe理私钥的选项进行访问。 更多细节在这里: https : //serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791
错误是通用的,SSL / TLS协商失败的原因有很多。 最常见的是无效或过期的服务器证书,并且通过提供您自己的服务器证书validation挂钩来处理此问题,但不一定是唯一的原因。 服务器可能需要相互authentication,可能configuration了客户端不支持的一组密码,它可能会有一个时间漂移太大,握手成功和更多的原因。
最好的解决scheme是使用SChannel疑难解答工具集。 SChannel是负责SSL和TLS的SSPI提供商,您的客户将使用它进行握手。 看看TLS / SSL工具和设置 。
另请参阅如何启用Schannel事件日志logging 。
我有这个问题,试图击中Styles/Fun.png ,这是一个由CloudFlare分布在CDN上的图像,支持疯狂的东西,如SPDY和奇怪的redirectSSL证书。
而不是像Simons的答案中指定Ssl3,我可以通过下面的Tls12来解决这个问题:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; new WebClient().DownloadData("Styles/Fun.png");
另一种可能性是不正确的证书input。 确保select了被圈起来的checkbox。 最初我没有这样做,所以代码是超时或抛出同样的例外,因为私人密钥不能被find。
经过很长时间的这个相同的问题,我发现客户端服务运行的ASP.NET帐户没有访问证书。 我通过进入Web应用程序所运行的IIS应用程序池来进行修复,进入高级设置,并将身份从NetworkService
更改为LocalSystem
帐户。
更好的解决scheme是使证书与默认的NetworkService
帐户一起工作,但这适用于快速functiontesting。
正如你所看到的,这可能有很多原因。 以为我会添加我遇到的原因…
如果将WebRequest.Timeout
的值设置为0
,则这是引发的exception。 下面是我有的代码…(除了代替超时值的硬编码0
,我有一个无意中设置为0
的参数)。
WebRequest webRequest = WebRequest.Create(@"https://myservice/path"); webRequest.ContentType = "text/html"; webRequest.Method = "POST"; string body = "..."; byte[] bytes = Encoding.ASCII.GetBytes(body); webRequest.ContentLength = bytes.Length; var os = webRequest.GetRequestStream(); os.Write(bytes, 0, bytes.Length); os.Close(); webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ...
如果服务器正在向HTTP请求返回HTTP 401未经授权的响应,则可能发生“请求已中止:无法创buildSSL / TLS安全通道”exception。
您可以通过为您的客户端应用程序打开跟踪级别的System.Net日志logging来确定是否发生这种情况,如本答复中所述 。
一旦这个日志configuration就绪,运行应用程序并重现错误,然后在日志输出中查找这样一行:
System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.
在我的情况下,我没有设置服务器期待的特定cookie,导致服务器响应401错误的请求,从而导致“无法创buildSSL / TLS安全通道”exception。
我一整天都在为这个问题而苦苦挣扎。
当我使用.NET 4.5创build一个新项目时,我终于find了工作。
但是,如果我降级到4.0,我又得到了同样的问题,这是不可逆转的项目(即使我试图升级到4.5)。
奇怪没有其他错误消息,但“请求被中止:无法创buildSSL / TLS安全通道。” 想出了这个错误
原来的答案没有。 我添加了更多的代码,使其防弹。
ServicePointManager.Expect100Continue = true; ServicePointManager.DefaultConnectionLimit = 9999; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
在我的例子中,这个例外的根源是在代码中的某个时刻,以下内容被称为:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
这真的很糟糕。 它不仅会指示.NET使用不安全的协议,还会影响您的AppDomain中随后生成的每个新的WebClient(以及类似的)请求。 (请注意,传入的Web请求在您的ASP.NET应用程序中不受影响,但新的WebClient请求(例如与外部Web服务交谈)是)。
在我的情况下,实际上并不需要,所以我可以删除声明,我的所有其他networking请求再次开始工作正常。 根据我在别处读到的内容,我学到了一些东西:
- 这是您的appdomain中的全局设置,如果您有并发活动,则无法可靠地将其设置为一个值,执行操作,然后将其设置回来。 另一个行动可能发生在这个小窗口,并受到影响。
- 正确的设置是保持默认。 这允许.NET继续使用任何最安全的默认值,随着时间的推移和升级框架。 将其设置为TLS12(这是本文最安全的版本) 现在可以正常工作,但在5年内可能开始出现一些不可思议的问题。
- 如果你真的需要设置一个值,你应该考虑在一个单独的专门的应用程序或应用程序域中,并find一个方法来讨论它和你的主池。 因为这是一个单一的全球价值,试图在繁忙的应用程序池中pipe理它只会导致麻烦。 这个答案: https : //stackoverflow.com/a/26754917/7656通过自定义代理提供了一个可能的解决scheme。 (注意我没有亲自实施它。)
如果客户端是Windows机器,则可能的原因可能是服务所需的tls或ssl协议未激活。
这可以设置在:
控制面板 – >networking和Internet – > Internet选项 – >高级
滚动设置到“安全”并select
- 使用SSL 2.0
- 使用SSL 3.0
- 使用TLS 1.0
- 使用TLS 1.1
- 使用TLS 1.2
The request was aborted: Could not create SSL/TLS secure channel
另一个可能的原因The request was aborted: Could not create SSL/TLS secure channel
错误是您的客户端PCconfiguration的cipher_suites值与服务器configuration为愿意并且能够接受的值不匹配 。 在这种情况下,当您的客户端在其初始SSL握手/协商“客户端Hello”消息中发送它能够接受的cipher_suites值列表时,服务器将看到所提供的值均不可接受,并可能返回“Alert “而不是进入SSL握手的”服务器问候“步骤。
为了研究这种可能性,您可以下载Microsoft消息分析器 ,并使用该消息分析器在您尝试build立与服务器(在您的C#应用程序)上的HTTPS连接失败时发生的SSL协商上运行跟踪。
如果您能够从其他环境(例如您提到的Windows XP计算机)成功连接到HTTPS,或者可以通过在非Microsoft浏览器中使用操作系统的密码套件设置(例如Chrome或Firefox),请在该环境中运行另一个消息分析器跟踪,以捕获SSL协商成功时发生的情况。
希望您能看到两个Client Hello消息之间的一些区别,这将允许您准确指出失败的SSL协商导致失败的原因。 然后,您应该能够对Windows进行configuration更改,以使其成功。 IISCrypto是一个很好的工具(甚至对于客户端PC,尽pipe有“IIS”的名字)。
以下两个Windowsregistry项pipe理您的PC将使用的cipher_suites值:
- HKLM \ SOFTWARE \政策\微软\encryption\configuration\ SSL \ 00010002
- HKLM \系统\ CurrentControlSet \控制\encryption\configuration\本地\ SSL \ 00010002
以下是关于如何调查和解决这种Could not create SSL/TLS secure channel
问题的实例的完整说明: http : //blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in -windows.html
您可以尝试安装演示证书(一些SSL提供商免费提供一个月),以确定问题是否与证书有效性相关。
只要这是一个相对“活”的环节,我想我会添加一个新的选项。 这种可能性是由于Poodle攻击的问题,该服务不再支持SSL 3.0。 看看这个Google的声明。 我一次遇到了几个Web服务的这个问题,并意识到一些事情正在进行。 我切换到TLS 1.2,一切都在工作。
http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html
我的问题是,我试图在IIS上作为Web服务进行部署,我在服务器上安装了证书,但运行IIS的用户对证书没有正确的权限。
如何让ASP.NET访问证书存储中的证书中的私钥?
这仅仅发生在一个网站上,事实certificate它只有RC4密码。 在之前的努力加强服务器,我已经禁用了RC4密码,一旦我重新启用这个问题解决了。
除了上面的答案之外,请确保您已将CER证书,而不是PFX文件导入您的本地机器商店。 当你有两个文件时常见的错误。
在我的情况下,当Windows服务试图连接到Web服务时,我遇到了这个问题。 最后看Windows事件,我发现了一个错误代码。
事件ID 36888(Schannel)被提出:
The following fatal alert was generated: 40. The internal error state is 808.
最后它与Windows修补程序有关。 在我的情况下:KB3172605和KB3177186
在vmware论坛中提出的解决scheme是在Windows中添加一个registry项。 添加以下registry后,所有工作正常。
[HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \控制\ SecurityProviders \ SCHANNEL \ KeyExchangeAlgorithms \的Diffie-Hellman]
“ClientMinKeyBitLength”= DWORD:00000200
显然,它与客户端的https握手中的缺失值有关。
列出您的Windows修补程序:
wmic qfe list
解决scheme主题
https://communities.vmware.com/message/2604912#2604912
希望这是帮助。
这个在MVC webclient中为我工作
public string DownloadSite(string RefinedLink) { try { Uri address = new Uri(RefinedLink); ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; using (WebClient webClient = new WebClient()) { var stream = webClient.OpenRead(address); using (StreamReader sr = new StreamReader(stream)) { var page = sr.ReadToEnd(); return page; } } } catch (Exception e) { log.Error("DownloadSite - error Lin = " + RefinedLink, e); return null; } }
我有这个问题,因为我的web.config有:
<httpRuntime targetFramework="4.5.2" />
并不是:
<httpRuntime targetFramework="4.6.1" />
在我的情况下,运行应用程序的服务帐户没有访问私钥的权限。 一旦我给了这个许可,错误消失了
- MMC
- 证书
- 扩展到个人
- select证书
- 右键点击
- 所有的任务
- pipe理私钥
- 加
默认的.NET ServicePointManager.SecurityProtocol
使用SSLv3和TLS。 如果您正在访问Apache服务器,则会有一个名为SSLProtocol
的configurationvariables,默认为TLSv1.2。 您可以将ServicePointManager.SecurityProtocol
设置为使用Web服务器支持的相应协议,也可以更改Apacheconfiguration以允许所有协议(如SSLProtocol
all
。