该请求已中止:无法创建SSL / TLS安全通道


431

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。这会改变吗?



51
到了2018年,这个问题已经被查看了308,056次,但仍然没有适当的解决方法!我随机遇到此问题,这里或任何其他线程中提到的修复都没有解决我的问题。
Nigel Fds

3
@NigelFds该错误The request was aborted: Could not create SSL/TLS secure channel是非常普通的错误。它基本上说:“由于多种可能的原因之一,SSL / TLS / HTTPS连接初始化失败。” 因此,如果您定期在特定情况下使用它,最好的选择是提出一个特定问题,并提供有关该情况的特定详细信息。并检查事件查看器以获取更多信息。和/或启用某些.NET客户端调试以获取更多详细信息(服务器证书不受信任吗?是否存在密码不匹配?SSL / TLS协议版本不匹配等)。
MarnixKlooster ResstateMonica

4
@MarnixKlooster我已经检查了所有这些,证书不会有问题,就像我重试一样,它可以工作。而且我怀疑我是否能够在没有别人来将其标记为重复或某物的情况下提出这样的问题。
奈杰尔·弗德斯

1
我可能是第四次与这个问题作斗争。我正在运行的相同代码库在生产中以及在我的一些其他开发人员的开发环境中都可以正常工作。上次,我被指示添加一个注册表值Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ .NETFramework \ v4.7.02046 \ SchUseStrongCrypto [DWORD] =1。它工作了一段时间。我开始在另一个项目中工作了一段时间,现在回到这个项目,即使此注册表项修复,请求也再次失败。很烦人。
米格尔(Miguel)

Answers:


598

我终于找到了答案(我没有注明出处,但来自搜索);

当代码在Windows XP中运行时,在Windows 7中,必须在开头添加以下代码:

// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons

现在,它可以完美运行。


附录

如罗宾·法文(Robin French)所述;如果您在配置PayPal时遇到此问题,请注意,从2018年12月3日开始,它们将不支持SSL3。您需要使用TLS。这是关于此的贝宝页面


5
深入到SecurityProtocolType.Tls12实际上为我解决了这个问题。请参阅下面的答案。
Bryan Legend

24
SSLv3已有18岁,现在容易受到POODLE攻击-正如@LoneCoder建议使用SecurityProtocolType.Tls12是SecurityProtocolType.Ssl3的合适替代品
gary

4
直到找到针对此的利用(实际上并非所有站点都支持Tls12为止),否则SecurityProtocolType.Tls可能实际上是一个更好的选择
gary

3
PayPal已将日期设置为2017年6月30日,以禁用SSL3并实施TLS1.2。它已经在他们的沙盒环境中应用 paypal-knowledge.com/infocenter/...
罗宾法国

11
也看到这个。您无需将其专门设置为单一类型,也可以简单地追加。System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
奈-8

153

.NET 4.5中的解决方案是

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

如果您没有.NET 4.5,请使用

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

10
谢谢!我需要使用.net 4.0,却不知道该如何解决。这似乎在这里工作。:)
Fabiano

不适用于Windows Server 2008R2(可能还适用于2012)
Misam

@billpg,请阅读此文章以获得更准确的答案
Vikrant

对于VB类型(因为此答案在Google中显示),等效代码为ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
ConfusionTowers

@Andrej Z在.net Framework 4上的工作。谢谢。
az fav

107

确保在创建HttpWebRequest之前进行了ServicePointManager设置,否则将无法使用。

作品:

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

失败:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;

4
您上面提到的Works和Fails有什么区别?
Chandy Kunhu

5
太棒了 我的请求仅在第二次尝试后才起作用,这没有任何意义,然后我看到您的帖子,在请求之前移动了安全协议,并修复了问题。谢谢@ hogarth45
deanwilliammills 18-10-9

2
究竟!当我在创建请求之前放置ServicePointManager时,它为我工作了,谢谢,您节省了我的时间。

1
完美...这真是太好了
Maryam Bagheri 19/12/17

1
在我们的情况下,请求第一次失败,此后起作用。正是由于此答案中所述的原因!
Mohammad Dehghan

34

您遇到的问题是aspNet用户无权访问证书。您必须使用winhttpcertcfg.exe授予访问权限

有关如何进行设置的示例,请访问:http : //support.microsoft.com/kb/901183

在步骤2中的更多信息

编辑:在较新版本的IIS中,此功能内置于证书管理器工具中-可以通过右键单击证书并使用管理私钥的选项来访问此功能。此处有更多详细信息:https : //serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791


我尝试执行winhttpcertcfg.exe ...请注意,我在Windows 7上。它可以更改某些内容吗?
西蒙·杜格雷(SimonDugré)2010年

我不确定是否相关,但是这篇文章让我想到了在从VS进行此调用时以管理员身份运行VS的想法,这为我解决了这个问题。
PFranchise

2
在Windows 7和更高版本中,证书必须位于本地计算机的存储中,而不是当前用户的存储中,以便“管理私钥”
Lukos 2015年

1
是的,这是我的问题。使用mmc.exe,添加证书管理单元(对我来说,我选择了“本地计算机”)。右键单击证书,所有任务,管理私钥。添加“每个人”(对于本地开发人员来说,这是最简单的-产品显然需要您的IIS网站应用程序池/用户)
Ian Yates

@lIan Yates,此解决方案仅对我有用(y)
Usman Younas

31

该错误是通用的,并且SSL / TLS协商可能失败的原因有很多。最常见的是无效或过期的服务器证书,您通过提供自己的服务器证书验证钩来解决此问题,但这不一定是唯一的原因。服务器可能需要相互认证,可能会配置有客户端不支持的一组密码,它的时间漂移​​太大,无法使握手成功,还有许多原因。

最好的解决方案是使用SChannel故障排除工具集。SChannel是负责SSL和TLS的SSPI提供程序,您的客户端将使用它进行握手。查看TLS / SSL工具和设置

另请参阅如何启用Schannel事件日志记录


哪里是Schannel event logging视窗10年7月8日
PreguntonCojoneroCabrón

在C#中以编程方式对TLS / SSL进行故障排除
Kiquenet '18

27

我遇到了这个问题,试图访问https://ct.mob0.com/Styles/Fun.png,这是CloudFlare在CDN上分发的图像,该图像支持诸如SPDY和奇怪的重定向SSL证书之类的疯狂东西。

而不是像Simons Answer中那样指定Ssl3,我可以通过像这样下降到Tls12来修复它:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");

谢谢Lone,这真是太疯狂了,根据情况,似乎有很多不同的可能性发生问题,而且,正如我所看到的,没有真正的记录。好吧,感谢您指出可能遇到相同问题的人。
西蒙·杜格雷(SimonDugré)2014年

这对我有用。从办公室局域网切换到家庭网络时,我遇到了错误。相同的代码,相同的笔记本电脑!
阿马尔(Amal)

您是否总是(在所有请求中)或有时收到错误?
PreguntonCojoneroCabrón

24

经过很长时间的研究,我发现客户端服务所运行的ASP.NET帐户无权访问证书。我通过进入运行Web应用程序的IIS应用程序池,进入“高级设置”,然后将标识LocalSystem从更改为帐户来修复此问题NetworkService

更好的解决方案是使证书与默认NetworkService帐户一起使用,但这可用于快速功能测试。


3
这个答案应该有更多的赞成票。经过一周的研究,这是唯一对我有用的解决方案。谢谢!!
user224567893'1

这对我有用。很好,谢谢。
Emy Stats

18

设定的方法

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

似乎还可以,因为Tls1.2是安全协议的最新版本。但是我决定更深入地研究并回答我们是否真的需要对其进行硬编码。

规格:Windows Server 2012R2 x64。

从互联网上得知,.NetFramework 4.6+必须默认使用Tls1.2。但是,当我将项目更新为4.6时,什么也没发生。我发现了一些信息,告诉我需要手动进行一些更改才能默认启用Tls1.2

https://support.microsoft.com/zh-CN/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

但是建议的Windows更新不适用于R2版本

但是帮助我的是在注册表中添加了2个值。您可以使用下一个PS脚本,以便将它们自动添加

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

这就是我一直在寻找的东西。但是我仍然无法回答为什么NetFramework 4.6+不会自动设置此... Protocol值的问题?


17

原始答案没有的东西。我添加了一些代码以使其更安全。

ServicePointManager.Expect100Continue = true;
        ServicePointManager.DefaultConnectionLimit = 9999;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

8
我不建议添加SSL3协议。
Peter de Bruijn

SSL3有一个严重的安全问题,称为“贵宾犬”。
彼得·德布赖恩

@PeterdeBruijn Tls and Tls11淘汰了
Kiquenet '18 -4-10

1
@Kiquenet-是的。从2018年6月开始,PCI(支付卡行业)将不允许协议使用低于TLS1.2的协议。(原定于06/2017发布,但推迟了一年)
GlennG

SSL / TLS家族中有五种协议:SSL v2,SSL v3,TLS v1.0,TLS v1.1和TLS v1.2github.com/ssllabs/research/wiki/… SSL v2 unsecure, SSL v3 is insecure when used with HTTP (the POODLE attack), TLS v1.0, TLS v1.1 obsoletes 只有有效的选项是 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Kiquenet '18

14

另一种可能是包装盒上的证书输入不正确。确保选中带圆圈的复选框。最初我没有这样做,所以代码要么超时要么抛出与找不到私钥相同的异常。

证书导入对话框


客户端始终必须重新安装证书才能使用客户端程序。一遍又一遍,他们将不得不在使用该程序之前重新安装证书。我希望这个答案可以解决该问题。
Pangamma

11

如果服务器对HTTP请求返回HTTP 401未经授权的响应,则会发生“请求已中止:无法创建SSL / TLS安全通道”异常。

您可以通过打开客户端应用程序的跟踪级System.Net日志记录来确定是否正在发生这种情况,如本答案所述

设置好日志记录后,运行应用程序并重现错误,然后在日志记录输出中查找如下所示的行:

System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.

在我的情况下,我无法设置服务器期望的特定cookie,从而导致服务器以401错误响应请求,从而导致“无法创建SSL / TLS安全通道”异常。


1
我的任务计划程序每天(而不是周末)执行。我收到相同的错误,但有时会出现(2 errors in 2 months)。收到错误消息后,几分钟后我再次尝试手动,一切正常。
Kiquenet

10

The request was aborted: Could not create SSL/TLS secure channel错误的另一个可能原因是客户端PC的已配置cipher_suites值与服务器配置为愿意且能够接受的值之间不匹配。在这种情况下,当您的客户端在其初始SSL握手/协商“客户端问候”消息中发送其能够接受的cipher_suites值列表时,服务器会看到所有提供的值都不可接受,并且可能会返回“警告” ”响应,而不是继续进行SSL握手的“服务器问候”步骤。

要研究这种可能性,可以下载Microsoft Message Analyzer,并使用它在尝试与服务器建立HTTPS连接失败时(在C#应用中)对SSL协商运行跟踪。

如果您能够从另一个环境(例如,您提到的Windows XP计算机)成功建立HTTPS连接,或者可以通过在不使用操作系统密码套件设置的非Microsoft浏览器中点击HTTPS URL,例如Chrome或Firefox),请在该环境中运行另一个Message Analyzer跟踪,以捕获SSL协商成功后发生的情况。

希望您会看到两条Client Hello消息之间的一些区别,这将使您能够准确查明SSL协商失败导致其失败的原因。然后,您应该能够对Windows进行配置更改,以使其成功。 IISCrypto是用于此目的的出色工具(即使对于客户端PC,尽管具有“ IIS”名称)。

以下两个Windows注册表项控制您的PC将使用的cipher_suites值:

  • HKLM \ SOFTWARE \ Policies \ Microsoft \ Cryptography \ Configuration \ SSL \ 00010002
  • HKLM \ SYSTEM \ CurrentControlSet \ Control \ Cryptography \ Configuration \ Local \ SSL \ 00010002

这是我如何研究和解决各种Could not create SSL/TLS secure channel问题的完整文章:http : //blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html


1
就我而言,此答案很有帮助。另外,由于我怀疑客户端PC缺少某些密码套件,因此我选择了一个快捷方式并直接安装了此Windows Update,以尝试运气(support.microsoft.com/zh-cn/help/3161639,需要重新启动Windows),然后才能真正启动Windows Server 2003。搜索邮件分析器,结果很幸运,它解决了我的问题,为自己节省了搜索时间。
sken130 '18

1
请注意,当您在Firefox之类的浏览器中测试HTTPS链接时,即使您获得的密码与任何给定Windows Update提供的密码不同,也仍然值得尝试Windows Update,因为安装新密码会影响密码协商在客户端PC和服务器之间,从而增加了找到匹配项的希望。
sken130 '18

直截了当地回答我的问题。有两件事帮助我找到了要进行的更改。1.加密套件支持Web服务器:ssllabs.com/ssltest 2.密码套件不同版本Windows的支持:docs.microsoft.com/en-us/windows/win32/secauthn/...
保罗B.

10

在我的情况下,此异常的根源是在代码中的某个时刻调用了以下代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

这真的很糟糕。它不仅指示.NET使用不安全的协议,而且还会影响到您的appdomain中随后发出的每个新的WebClient(和类似的)请求。(请注意,传入的Web请求在您的ASP.NET应用程序中不受影响,但是新的WebClient请求(例如与外部Web服务进行通信)则受到影响)。

就我而言,实际上并不需要它,因此我可以删除该语句,然后所有其他Web请求又可以正常工作了。根据我在其他地方的阅读,我学到了一些东西:

  • 这是您appdomain中的全局设置,如果您有并发活动,则无法可靠地将其设置为一个值,执行操作,然后再将其重新设置。在该小窗口内可能会发生另一项操作,并且该操作会受到影响。
  • 正确的设置是将其保留为默认值。这样,随着时间的推移和升级框架,.NET可以继续使用最安全的默认值。将其设置为TLS12(在撰写本文时是最安全的)现在可以使用,但是在5年后可能会开始引起神秘的问题。
  • 如果确实需要设置值,则应考虑在单独的专用应用程序或appdomain中进行设置,并找到一种在其与主池之间进行通信的方法。因为这是一个全局值,所以在繁忙的应用程序池中尝试对其进行管理只会带来麻烦。这个答案:https : //stackoverflow.com/a/26754917/7656 通过自定义代理提供了一种可能的解决方案。(请注意,我还没有亲自实现它。)

2
与您的一般经验法则相反,我将添加一个例外,那就是您必须将其设置为TLS 1.2,而不是让默认设置运行。如果您使用的是.NET 4.6之前的框架,并且在服务器上禁用了不安全的协议(SSL或TLS 1.0 / 1.1),那么除非您将程序强制为TLS 1.2,否则您将无法发出请求。
Paul


9

如您所知,可能有很多原因。以为我会补充我遇到的原因...

如果将的值设置WebRequest.Timeout0,则将引发此异常。以下是我拥有的代码...(除了没有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 ...

2
哇!感谢您提到这一点。首先无法相信,首先尝试了很多不同的事情。然后,最后将超时设置为10秒,异常消失了!这是我的解决方案。(y)
derFunk 2014年

9

得票最多的答案可能会是足以让大多数人。但是,在某些情况下,即使强制执行TLS 1.2,也可能继续出现“无法创建SSL / TLS安全通道”错误。如果是这样,您可能需要查阅此有用的文章有关其他故障排除步骤。总结:与TLS / SSL版本问题无关,客户端和服务器必须在“密码套件”上达成共识。在SSL连接的“握手”阶段,客户端将列出其支持的密码套件,以供服务器根据自己的列表进行检查。但是在某些Windows机器上,某些通用密码套件可能已被禁用(似乎是由于故意限制攻击面的企图),从而降低了客户端和服务器就密码套件达成协议的可能性。如果他们不同意,那么您可能会在事件查看器中看到“致命警报代码40”,并在.NET程序中看到“无法创建SSL / TLS安全通道”。

前面的文章介绍了如何列出计算机可能支持的所有密码套件,以及如何通过Windows注册表启用其他密码套件。为了帮助检查客户端上启用了哪些密码套件,请尝试访问MSIE中的此诊断页。(使用System.Net跟踪可能会提供更多确定的结果。)要检查服务器支持哪些密码套件,请尝试使用此联机工具(假设服务器可以通过Internet访问)。不用说,注册表编辑必须谨慎,尤其是在涉及网络的情况下。(您的计算机是远程托管的VM吗?如果您要中断网络连接,该VM完全可以访问吗?)

以我公司为例,我们通过注册表编辑器启用了多个其他的“ ECDHE_ECDSA”套件,以解决当前的问题并防止将来出现问题。但是,如果您不能(或不会)编辑注册表,那么就会想到许多变通办法(不一定漂亮)。例如:您的.NET程序可以将其SSL流量委派给一个单独的Python程序(由于在受影响的计算机上MSIE请求失败的情况下,Chrome请求可能会成功,因此它本身可能会起作用)。


9

造成此问题的最大原因之一是活动的.NET Framework版本。.NET Framework运行时版本会影响默认情况下启用的安全协议。

似乎没有关于它在不同版本中的具体工作方式的权威文档,但是似乎默认值或多或少地决定如下:

  • .NET Framework 4.5及更早版本-SSL 3.0,TLS 1.0
  • .NET Framework 4.6.x-TLS 1.0、1.1、1.2、1.3
  • .NET Framework 4.7+-系统(OS)默认值

(对于较旧的版本,根据系统上安装的.NET运行时的不同,里程可能会有所不同。例如,可能会出现以下情况:您使用的是非常旧的框架,并且不支持TLS 1.0或使用4.6。 x和TLS 1.3不支持)

Microsoft的文档强烈建议使用4.7+,并且系统默认值为:

我们建议您:

  • 在您的应用程序上定位.NET Framework 4.7或更高版本。WCF应用程序上的目标.NET Framework 4.7.1或更高版本。
  • 不要指定TLS版本。配置您的代码,以使操作系统决定TLS版本。
  • 执行彻底的代码审核,以验证您未指定TLS或SSL版本。

对于ASP.NET网站,请检查您<httpRuntime>元素中的.NET Framework版本,因为这将确定您的网站实际使用的运行时:

<httpRuntime targetFramework="4.5" />

更好:

<httpRuntime targetFramework="4.7" />

8

这个在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;
        }
    }

2
是否将重写ServerCertificateValidationCallback引入新的安全漏洞?

7

如果客户端是Windows计算机,则可能的原因可能是未激活服务所需的tls或ssl协议。

可以在以下位置设置:

控制面板->网络和Internet-> Internet选项->高级

向下滚动设置至“安全性”,然后选择

  • 使用SSL 2.0
  • 使用SSL 3.0
  • 使用TLS 1.0
  • 使用TLS 1.1
  • 使用TLS 1.2

在此处输入图片说明


勾选所有这些是否有任何问题?
奈杰尔·菲德斯

据我所知,没有问题...只是不建议使用ssl ...它们被认为不够安全。
cnom

如何在Powershell中以编程方式进行操作?
Kiquenet '18 -4-6

这会影响旧版本的Windows,进行一些研究,找出当前正在使用的安全选项。截至今天为止
Tod

7

就我而言,运行该应用程序的服务帐户无权访问私钥。一旦获得此许可,错误就会消失

  1. 多媒体卡
  2. 证书
  3. 扩展到个人
  4. 选择证书
  5. 右键点击
  6. 所有任务
  7. 管理私钥


6

我整天都在为这个问题而苦苦挣扎。

当我使用.NET 4.5创建一个新项目时,我终于可以使用它了。

但是,如果我降级到4.0,我会再次遇到相同的问题,并且对于该项目而言,这是不可逆的(即使当我尝试再次升级到4.5时)。

除了“请求已中止:无法创建SSL / TLS安全通道”,没有其他奇怪的错误消息出现此错误


5
之所以可行,可能是因为不同的.NET版本支持不同的SSL / TLS协议版本。更多信息:blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
Jon Schneider

4

System.Net.WebException:请求已中止:无法创建SSL / TLS安全通道。

在我们的案例中,我们在使用软件供应商,因此我们无权修改.NET代码。除非有更改,否则.NET 4显然不会使用TLS v 1.2。

我们的解决方法是将SchUseStrongCrypto密钥添加到注册表中。您可以将以下代码复制/粘贴到扩展名为.reg的文本文件中并执行它。它充当了我们解决该问题的“补丁”。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

3
此处PS用于快速编辑: New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo

2
此处PS用于快速编辑2: New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo

4

尝试这个:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我添加了这一行。有时它会失败,并且我会遇到相同的错误System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
Joseph Katzman

4

这对我来说是固定的,将网络服务添加到权限。右键单击证书>所有任务>管理私钥...>添加...>添加“网络服务”。



3

我遇到了同样的问题,发现此答案对我来说是正确的。密钥是3072。此链接提供有关“ 3072”修复的详细信息。

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);

就我而言,两个提要需要修复:

https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss

3

这个问题有很多答案,因为它与一般错误消息有关。我们在某些服务器上遇到了此问题,但在我们的开发机器上却没有遇到。拔掉大部分头发后,我们发现这是一个Microsoft错误。

https://support.microsoft.com/zh-CN/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect

本质上,MS假定您希望使用较弱的加密,但是操作系统已打补丁以仅允许TLS 1.2,因此您收到可怕的“请求已中止:无法创建SSL / TLS安全通道”。

有三个修复程序。

1)使用正确的更新修补操作系统:http : //www.catalog.update.microsoft.com/Search.aspx?q=kb4458166

2)将设置添加到您的app.config / web.config文件。

3)添加另一个答案中已经提到的注册表设置。

我发布的知识库文章中提到了所有这些内容。


另外,请确保仅在应用程序中设置一次ServicePointManager.SecurityProtocol。我们在应用程序中发现了第二个调用(这非常复杂,运行时会加载可选程序集),将其设置为SSL3,然后引发了相同的错误消息。
迈克尔·西尔弗

3

另一种可能是正在执行的代码没有所需的权限。

就我而言,使用Visual Studio调试器测试对Web服务的调用时出现此错误。Visual Studio没有以管理员身份运行,这导致了此异常。


2

对于我来说,这只是在一个站点上发生的,事实证明它只有RC4密码可用。为了加强服务器的安全性,在重新启用此功能后,我已禁用RC4密码。


1
不要在响应中使用链接,因为它们可能对将来不起作用,请在您的答案中指出其上最相关的方面
RodrigoLópez2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.