C# 身份验证失败,因为远程方已关闭传输流

Posted

技术标签:

【中文标题】C# 身份验证失败,因为远程方已关闭传输流【英文标题】:C# Authentication failed because the remote party has closed the transport stream 【发布时间】:2017-08-18 09:30:14 【问题描述】:

我想指出,我已经为此搜索了很多但没有解决方案。因此,我创建了一个循环,它将抛出包含链接的 listBox2,每次创建一个 http GET 请求以访问完整的源代码。

我的代码:

 private void button4_Click(object sender, EventArgs e)
    
        try
        
            for (int i = 0; i < listBox2.Items.Count; i++)
            
                code(listBox2.Items[i].ToString() + "\'");
                //await PutTaskDelay();
                //Console.WriteLine(listBox2.Items[i].ToString());
                if (VarrileKeeper.s.ToLower().Contains("mysql"))
                
                    Console.WriteLine("possitive " + listBox2.Items[i].ToString());
                
            
        
        catch (Exception Fejl)
        
            Console.WriteLine(Fejl);
        
    


 public static String code(string Url)
    

        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate  return true; ;


        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(Url);
        myRequest.MaximumAutomaticRedirections = 4;
        myRequest.MaximumResponseHeadersLength = 4;
        myRequest.Credentials = CredentialCache.DefaultCredentials;

        myRequest.Method = "GET";

        WebResponse myResponse = myRequest.GetResponse();


        StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
        string result = sr.ReadToEnd();
        sr.Close();
        myResponse.Dispose();
        myResponse.Close();
        VarrileKeeper.s = result;
        return result;
    

当循环命中各种 url 例如 (http://www.memphremagog.org/fr/lexique.php?id=32) 时会触发以下错误。奇怪的是,如果我删除循环并向该站点发出 http GET 请求,一切正常。

“System.Net.WebException”类型的第一次机会异常发生在 System.dll System.Net.WebException:底层连接是 关闭:发送时发生意外错误。 ---> System.IO.IOException:身份验证失败,因为远程方 已关闭传输流。

我认为证书没有问题,否则当我删除循环时,http://www.memphremagog.org/fr/lexique.php?id=32 上仍然会出现错误。

欢迎提出任何建议。

【问题讨论】:

当你调试时,在你的 code() 方法中你传递的字符串是什么?是不是类似于“http://www.memphremagog.org/fr/lexique.php?id=32\'”?确保您传递的 URL 有效 代码是否可以在循环中正常工作,并且只是间歇性地失败?还是循环永远不起作用? 该 URL 是有效的,否则当我在循环外运行 code() 时它不起作用我已经在循环外手动测试了所有链接,女巫工作没有错误。循环工作正常,直到它点击例如这个 url (memphremagog.org/fr/lexique.php?id=32) 并且当我在循环外使用该 url 运行它时它工作正常。所以对我来说,在我开始循环之前似乎一切正常。是的,它只是间歇性地发生。 调试并在遇到错误时检查字符串Url的值。 woah woah woah .. 您正在尝试扫描 mysql 注入漏洞,不是吗。 【参考方案1】:

来自您的 cmets 的 zvoxaudio.com 网址非常棘手。他们有一些机器人检测,用于将物品添加到购物车。您专门使用的链接似乎无论如何都不起作用,我认为它使用的是过期的项目ID;我可以通过将 id 更新为 4007001 并将其更改为“https”来使用它。但是,此链接正在将商品添加到购物车,并且该站点不允许机器人将商品添加到购物车,该站点返回 400 错误,标题中带有此键:值:

X-Error-Message: Bots are not allowed to add items to cart

尝试像这样将 UserAgent 添加到您的请求中:

  myRequest.UserAgent = "Nada";

有了这些改动,ZVOXAUDIO 链接就可以工作了!

如果您想将网址保留为“https”请求,只需将其添加到您的代码中即可。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

这是必需的,因为 ZVOXAUDIO 不支持 TLS 1.0 或更早的协议。如果您使用的 .NET 版本不支持 TLS 1.2,您可以使用 SecurityProtocolType.Tls11,因为 ZVOXAUDIO 仍然支持 TLS 1.1。

但是,大概是因为您正试图在尽可能多的站点上运行它,您可能不想只允许 TLS 1.2,因为旧的服务器可能不支持它。我会这样设置你的安全协议:

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

作为建议,您可以在循环之外设置服务器证书验证回调和安全协议,因为它是所有请求的静态设置。此外,如果您使用 C# 语法,Dispose 方法会为您关闭和处理您的 WebResponse 和 StreamReader 变量。而 C# 在 .NET 3.0 中引入了“var”,您可能想开始接受它,假设您使用的是 3.0 或更新的框架。如果你想看看这会是什么样子,请看下面。

确保你有这些用法:

using System;
using System.IO;
using System.Net;

然后将这两行放入表单或对象的静态构造函数中,我假设您现在正在使用表单:

ServicePointManager.ServerCertificateValidationCallback = delegate  return true; ;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;

那么你的两个方法应该是这样的:

private void button4_Click(object sender, EventArgs e)

  try
  
    for (var i = 0; i < listBox2.Items.Count; i++)
    
      var response = Code(listBox2.Items[i].ToString() + "\'");
      if (response.ToLower().Contains("mysql"))
      
        Console.WriteLine("positive " + listBox2.Items[i].ToString());
      
    
  
  catch (Exception ex)
  
    Console.WriteLine(ex.Message);
  



public static string Code(string url)

  var webRequest = (HttpWebRequest)WebRequest.Create(url);
  webRequest.MaximumAutomaticRedirections = 4;
  webRequest.MaximumResponseHeadersLength = 4;
  webRequest.UserAgent = "Mozilla/5.0 (Taco2) Gecko/20100101";
  webRequest.Credentials = CredentialCache.DefaultCredentials;

  webRequest.Method = "GET";

  using (var webResponse = webRequest.GetResponse())
  
    using (var sr = new StreamReader(webResponse.GetResponseStream(), System.Text.Encoding.UTF8))
    
      return sr.ReadToEnd();
    
  

编码愉快!如有任何问题,请随时在下面的 cmets 中提问。

【讨论】:

【参考方案2】:

这是由于安全协议问题而发生的。只需在请求上下文之前添加以下行。

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

【讨论】:

【参考方案3】:

这发生在我身上,但对我来说,这是由于安全协议问题。

只需添加这一行

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

更多信息 -> https://codeshare.co.uk/blog/how-to-fix-the-error-authentication-failed-because-the-remote-party-has-closed-the-transport-stream/

【讨论】:

【参考方案4】:

就我而言,问题在于我使用的邮件服务(mailgun)的凭据。

自创建凭据以来已过去 1 年,所以我想需要更新。

重置凭据密码为我解决了这个问题。

【讨论】:

【参考方案5】:

只需在您的网络请求上方调用以下函数:

    protected void Application_Start()
    
        if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Tls12) == false)
        
            ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol | SecurityProtocolType.Tls12;
          
       
    

【讨论】:

以上是关于C# 身份验证失败,因为远程方已关闭传输流的主要内容,如果未能解决你的问题,请参考以下文章

iOS (APN) - 身份验证失败,因为远程方已关闭 C# 中的传输流

普通用户的“身份验证失败,因为远程方已关闭传输流”

HttpWebrequest 失败,内部异常身份验证失败,因为远程方已关闭传输流

推送通知上的错误“身份验证失败,因为远程方已关闭传输流”

身份验证失败,因为远程方已关闭传输流

身份验证失败,因为远程方已关闭传输流 - 发送 smtp 错误