请求已中止:无法创建SSL / TLS安全通道
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请求已中止:无法创建SSL / TLS安全通道相关的知识,希望对你有一定的参考价值。
由于此错误消息,我们无法使用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;
}
问题是服务器永远不会验证证书并因上述错误而失败。有谁知道我该怎么办?
我应该提到一位同事和我几周前进行了测试,并且它与我上面写的内容类似。我们发现的唯一“主要差异”是我使用的是Windows 7并且他使用的是Windows XP。这有什么改变吗?
我终于找到了答案(我没有注意到我的来源,但它来自搜索);
虽然代码适用于Windows XP,但在Windows 7中,您必须在开头添加此代码:
// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons
现在,它完美无缺。
附录
如罗宾法国人所说;如果您在配置PayPal时遇到此问题,请注意,从2018年12月开始,他们不支持SSL3。您需要使用TLS。这是关于它的Paypal page。
如果服务器正在向HTTP请求返回HTTP 401 Unauthorized响应,则“请求已中止:无法创建SSL / TLS安全通道”异常可能发生。
您可以通过为客户端应用程序启用跟踪级System.Net日志记录来确定是否发生这种情况,如this answer中所述。
一旦该日志记录配置到位,运行应用程序并重现错误,然后在日志记录输出中查找如下所示的行:
System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.
在我的情况下,我没有设置服务器期望的特定cookie,导致服务器响应401错误的请求,这反过来导致“无法创建SSL / TLS安全通道”异常。
这个在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;
}
}
在我的例子中,这个异常的根源是在代码中的某个时刻调用了以下内容:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
这真的很糟糕。它不仅指示.NET使用不安全的协议,而且这会影响您的appdomain中随后发出的每个新WebClient(和类似)请求。 (请注意,传入的Web请求在您的ASP.NET应用程序中不受影响,但新的WebClient请求(例如与外部Web服务通信)都是如此。
在我的情况下,它实际上并不需要,所以我可以删除该语句,我的所有其他Web请求再次开始正常工作。基于我在其他地方的阅读,我学到了一些东西:
- 这是您的appdomain中的全局设置,如果您有并发活动,则无法将其可靠地设置为一个值,执行操作,然后将其设置回来。在该小窗口期间可能发生另一个动作并受到影响。
- 正确的设置是保留默认值。这允许.NET随着时间的推移继续使用任何最安全的默认值并升级框架。将它设置为TLS12(这是写作时最安全的)现在可以工作,但在5年内可能会开始引起神秘的问题。
- 如果您确实需要设置值,则应考虑在单独的专用应用程序或应用程序域中执行此操作,并找到在它与主池之间进行通信的方法。因为它是一个单一的全局值,尝试在繁忙的应用程序池中管理它只会导致麻烦。这个答案:https://stackoverflow.com/a/26754917/7656通过自定义代理提供了一种可能的解决方案。 (注意我没有亲自实现它。)
正如您所知,这可能有很多原因。以为我会添加我遇到的原因......
如果将WebRequest.Timeout
的值设置为0
,则抛出该异常。下面是我的代码...(除了超时值的硬编码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 ...
The request was aborted: Could not create SSL/TLS secure channel
错误的另一个可能原因是客户端PC配置的cipher_suites值与服务器配置为愿意并且能够接受的值不匹配。在这种情况下,当您的客户端在其初始SSL握手/协商“客户端Hello”消息中发送它能够接受的cipher_suites值列表时,服务器会发现所提供的值都不可接受,并且可能返回“警报” “响应而不是继续进行SSL握手的”服务器Hello“步骤。
要研究这种可能性,您可以下载Microsoft Message Analyzer,并使用它来运行SSL协商时的跟踪,当您尝试并且无法建立到服务器的HTTPS连接时(在C#应用程序中)。
如果您能够从另一个环境(例如您提到的Windows XP计算机)成功建立HTTPS连接,或者可能通过在不使用操作系统密码套件设置的非Microsoft浏览器中访问HTTPS URL,例如Chrome或Firefox),在该环境中运行另一个Message Analyzer跟踪,以捕获SSL协商成功时发生的情况。
希望您会看到两个Client Hello消息之间的某些区别,这些消息将使您能够准确查明失败的SSL协商导致其失败的原因。然后,您应该能够对Windows进行配置更改,以使其成功。 IISCrypto是一个很好用的工具(即使是客户端PC,尽管有“IIS”名称)。
以下两个Windows注册表项控制您的PC将使用的cipher_suites值:
- HKLM SOFTWARE 政策微软加密配置 SSL 00010002
- HKLM 系统 CurrentControlSet 控制加密配置本地 SSL 00010002
这里是我如何调查和解决这种各种Could not create SSL/TLS secure channel
问题的实例的完整文章:http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html
我整天都在努力解决这个问题。
当我使用.NET 4.5创建一个新项目时,我终于开始工作了。
但是,如果我降级到4.0,我又遇到了同样的问题,这对于那个项目是不可逆转的(即使我试图再次升级到4.5)。
奇怪没有其他错误消息,但“请求已中止:无法创建SSL / TLS安全通道。”想出了这个错误
在客户端是Windows机器的情况下,可能的原因可能是服务所需的tls或ssl协议未被激活。
这可以设置为:
控制面板 - >网络和Internet - > Internet选项 - >高级
将设置滚动到“安全”并在两者之间进行选择
- 使用SSL 2.0
- 使用SSL 3.0
- 使用TLS 1.0
- 使用TLS 1.1
- 使用TLS 1.2
我有这个问题,因为我的web.config有:
<httpRuntime targetFramework="4.5.2" />
并不是:
<httpRuntime targetFramework="4.6.1" />
如果从Visual Studio运行代码,请尝试以管理员身份运行Visual Studio。解决了我的问题。
就我而言,运行应用程序的服务帐户没有访问私钥的权限。一旦我获得此许可,错误便消失了
- MMC
- 证书
- 扩展到个人
- 选择证书
- 右键点击
- 所有任务
- 管理私钥
- 加
在.NET 4.5中解决这个问题的方法是
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
如果您没有.NET 4.5,请使用
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
我遇到了同样的问题,发现this answer适合我。关键是3072.This link提供了'3072'修复的详细信息。
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);
在我的情况下,两个Feed需要修复:
https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss
System.Net.WebException:请求已中止:无法创建SSL / TLS安全通道。
在我们的例子中,我们使用软件供应商,因此我们无权修改.NET代码。显然,.NET 4不会使用TLS v 1.2,除非有更改。
我们的修复是将SchUseStrongCrypto密钥添加到注册表中。您可以将以下代码复制/粘贴到带有.reg扩展名的文本文件中并执行它。它是我们解决问题的“补丁”。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoft.NETFrameworkv4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[以上是关于请求已中止:无法创建SSL / TLS安全通道的主要内容,如果未能解决你的问题,请参考以下文章
错误 Paypal 沙箱:请求被中止:无法创建 SSL/TLS 安全通道
Braintree 中的“请求被中止:无法创建 SSL/TLS 安全通道”错误