首页 文章

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

提问于
浏览
237

由于此错误消息,我们无法使用 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 . 这有什么改变吗?

30 回答

  • 3

    我整天都在努力解决这个问题 .

    When I created a new project with .NET 4.5 I finally got it to work.

    但是,如果我降级到4.0,我又遇到了同样的问题,这对于那个项目是不可逆转的(即使我试图再次升级到4.5) .

    奇怪没有其他错误消息,但"The request was aborted: Could not create SSL/TLS secure channel."出现此错误

  • 1

    The request was aborted: Could not create SSL/TLS secure channel 错误的另一个可能原因是 mismatch between your client PC's configured cipher_suites values, and the values that the server is configured as being willing and able to accept . 在这种情况下,当您的客户端在其初始SSL握手/协商"Client Hello"消息中发送它能够接受的cipher_suites值列表时,服务器会发现所提供的值都不可接受,并且可能返回"Alert"响应而不是继续到SSL握手的"Server Hello"步骤 .

    要研究这种可能性,您可以下载Microsoft Message Analyzer,并使用它来运行SSL协商时的跟踪,当您尝试并且无法与服务器 Build HTTPS连接时(在C#应用程序中) .

    如果您能够从另一个环境(例如您提到的Windows XP计算机)成功 Build 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

  • 28

    我终于找到了答案(我没有注意到我的来源,但它来自搜索);

    虽然代码适用于Windows XP,但在Windows 7中,您必须在开头添加此代码:

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

    现在,它完美无缺 .


    ADDENDUM

    如罗宾法国人所说;如果您在配置PayPal时遇到此问题,请注意他们赢得't support SSL3 starting by December, 3rd 2018. You' ll需要使用TLS . 关于它,这是Paypal page .

  • 8

    在.NET 4.5中解决这个问题的方法是

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    

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

    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
    
  • 7

    您遇到的问题是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

  • 2

    该错误是通用的,并且SSL / TLS协商可能失败的原因有很多 . 最常见的是无效或过期的服务器证书,您通过提供自己的服务器证书验证挂钩来解决这个问题,但不一定是唯一的原因 . 服务器可能需要相互身份验证,它可能配置了客户端不支持的密码套件,它可能有一个时间漂移太大,握手成功和更多的原因 .

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

    另见How to enable Schannel event logging .

  • 24

    我有这个问题试图点击https://ct.mob0.com/Styles/Fun.png,这是由CloudFlare在它的CDN上分发的图像,它支持疯狂的东西,如SPDY和奇怪的重定向SSL证书 .

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

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

    确保在HttpWebRequest Build 之前进行了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;
    
  • 6

    经过长时间的同一个问题后,我发现运行客户端服务的ASP.NET帐户无法访问证书 . 我通过进入Web应用程序运行的IIS应用程序池,进入高级设置,并从 NetworkService 更改身份到 LocalSystem 帐户来修复它 .

    更好的解决方案是使证书使用默认的 NetworkService 帐户,但这适用于快速功能测试 .

  • 1

    原始答案没有的东西 . 我添加了一些代码以使其成为防弹 .

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

    另一种可能性是在盒子上输入不正确的证书 . 确保选中环绕的复选框 . 最初我没有这样做,因此代码要么超时要么抛出相同的异常,因为无法找到私钥 .

    certificate importation dialog

  • 354

    如果服务器向HTTP请求返回 HTTP 401 Unauthorized 响应,则可能发生"The request was aborted: Could not create SSL/TLS secure channel"异常 .

    您可以通过为客户端应用程序启用跟踪级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安全通道”异常 .

  • 0

    这个正在努力我在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;
            }
        }
    
  • 13

    正如您所知,这可能有很多原因 . 以为我会添加我遇到的原因......

    如果将 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 ...
    
  • 20

    在我的例子中,这个异常的根源是在代码中的某个时刻调用了以下内容:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    

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

    在我的情况下,它实际上并不需要,所以我可以删除该语句,我的所有其他Web请求再次开始正常工作 . 基于我在其他地方的阅读,我学到了一些东西:

    • 这是您的appdomain中的全局设置,如果您有并发活动,则无法将其可靠地设置为一个值,执行操作,然后将其设置回来 . 在该小窗口期间可能发生另一个动作并受到影响 .

    • 正确的设置是保持默认状态 . 这允许.NET随着时间的推移继续使用任何最安全的默认值并升级框架 . 将它设置为TLS12(这是撰写本文时最安全的)将起作用 now 但在5年内可能会开始引起神秘问题 .

    • 如果您确实需要设置值,则应考虑在单独的专用应用程序或应用程序域中执行此操作,并找到在它与主池之间进行通信的方法 . 因为它是一个单一的全局值,尝试在繁忙的应用程序池中管理它只会导致麻烦 . 这个答案:https://stackoverflow.com/a/26754917/7656通过自定义代理提供了一种可能的解决方案 . (注意我没有亲自实现它 . )

  • 6

    在客户端是Windows机器的情况下,可能的原因可能是服务所需的tls或ssl协议未被激活 .

    这可以设置为:

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

    将设置滚动到“安全”并在两者之间进行选择

    • 使用SSL 2.0

    • 使用SSL 3.0

    • 使用TLS 1.0

    • 使用TLS 1.1

    • 使用TLS 1.2

    enter image description here

  • 1

    一世有这个问题,因为我的web.config有:

    <httpRuntime targetFramework="4.5.2" />
    

    并不是:

    <httpRuntime targetFramework="4.6.1" />
    
  • 14

    就我而言,运行应用程序的服务帐户没有访问私钥的权限 . 一旦我获得此许可,错误便消失了

    • mmc

    • 证书

    • 扩展到个人

    • 选择证书

    • 右键单击

    • 所有任务

    • 管理私钥

    • 添加

  • 1

    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
    
  • 5

    对我来说问题是我试图在IIS上作为Web服务部署,我在服务器上安装了证书,但运行IIS的用户对证书没有正确的权限 .

    How to give ASP.NET access to a private key in a certificate in the certificate store?

  • 3

    如果从Visual Studio运行代码,请尝试以管理员身份运行Visual Studio . 解决了我的问题 .

  • 8

    我遇到了同样的问题,发现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
    
  • 21

    您可以尝试安装演示证书(一些ssl提供商免费提供一个月),以确保问题是否与证书有效性相关 .

  • 1

    只要这是一个相对“实时”的链接,我想我会添加一个新选项 . 由于Poodle攻击的问题,该服务可能不再支持SSL 3.0 . 查看关于此的Google声明 . 我立刻遇到了几个Web服务的问题,并意识到必须要进行一些事情 . 我切换到TLS 1.2,一切都恢复正常 .

    http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html

  • 1

    这只是在一个网站上发生的,事实证明它只有RC4密码可用 . 在先前努力强化服务器的过程中,我已经禁用了RC4密码,一旦我重新启用它,问题就解决了 .

  • 2

    除上述答案外,请确保已将CER证书,而不是PFX文件导入本地计算机商店 . 有这两个文件时常见的错误 .

  • 2

    在我的情况下,当Windows服务试图连接到Web服务时,我遇到了这个问题 . 最后查看Windows事件我发现了一个错误代码 .

    事件ID 36888(Schannel)被提出:

    The following fatal alert was generated: 40. The internal error state is 808.
    

    最后,它与Windows Hotfix有关 . 就我而言:KB3172605和KB3177186

    vmware论坛中提出的解决方案是在Windows中添加一个注册表项 . 添加以下注册表后一切正常 .

    [HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ KeyExchangeAlgorithms \ Diffie-Hellman]

    “ClientMinKeyBitLength”= DWORD:00000200

    显然,它与客户端https握手中的缺失值有关 .

    列出您的Windows HotFix:

    wmic qfe list
    

    解决方案线程

    https://communities.vmware.com/message/2604912#2604912

    希望它有所帮助 .

  • 14

    这个问题可以有很多答案,因为它关于一般的错误信息 . 我们在一些服务器上遇到了这个问题,但不是我们的开发机器 . 拔出大部分头发后,我们发现这是一个微软的错误 .

    https://support.microsoft.com/en-us/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)添加另一个答案中已经提到的注册表设置 .

    所有这些都在我发布的知识库文章中提到过 .

  • 3

    试试这个:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    
  • 61

    默认的.NET ServicePointManager.SecurityProtocol 使用SSLv3和TLS . 如果您正在访问Apache服务器,则会有一个名为 SSLProtocol 的配置变量,默认为TLSv1.2 . 您可以将 ServicePointManager.SecurityProtocol 设置为使用Web服务器支持的相应协议,也可以更改Apache配置以允许所有协议SSLProtocol all .

相关问题