C# 发送HttpWebRequest时出现SSL/TSL安全通道异常

C# 发送HttpWebRequest时出现SSL/TSL安全通道异常,c#,https,get,httpwebrequest,C#,Https,Get,Httpwebrequest,我有一个C#的下载方法。该方法向要下载的URL发送请求。但它给出了一些URL地址的错误。我遇到的最后一个URL问题是一个exe文件 我的方法: void DownloadProcedure() { #region Request-Response req = WebRequest.Create(url) as HttpWebRequest; req.UserAgent = "Mozilla/4.0 (compatible; MS

我有一个C#的下载方法。该方法向要下载的URL发送请求。但它给出了一些URL地址的错误。我遇到的最后一个URL问题是一个exe文件

我的方法:

    void DownloadProcedure()
    {

        #region Request-Response

        req = WebRequest.Create(url) as HttpWebRequest;
        req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
        req.AllowAutoRedirect = true;
        req.MaximumAutomaticRedirections = 5;
        req.ServicePoint.ConnectionLimit += 2;
        req.ServicePoint.Expect100Continue = true;
        req.ProtocolVersion = HttpVersion.Version10;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
            | SecurityProtocolType.Tls11
            | SecurityProtocolType.Tls12
            | SecurityProtocolType.Ssl3;
        // allows for validation of SSL conversations
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
        if (rangeAllowed)
            req.AddRange(from, to);
        resp = req.GetResponse() as HttpWebResponse;

        #endregion

        //...bla bla...
     }  
在这段代码中,它抛出的
GetResponse()
行无法创建SSL/TSL安全通道。但它并不总是扔。有时文件下载成功,有时抛出此异常。我不知道怎样才能度过难关


那么我如何解决这个问题呢?A

如果您在不同的URL上遇到这个问题: 您正在强制使用Http 1.0。目前,HTTP1.0、1.1和2。可用。也许你不应该用Http 1.0来限制自己。
另外,一些服务器仍然使用旧的SSL版本,因此您可能希望为它们添加支持…

我不确定是否可以从您发布的代码中诊断特定问题,但我认为您可以更笼统地说明您的
WebRequest
有多具体。无法保证在任何特定远程服务器上启用了哪些证书、协议或密码套件,也无法保证在运行代码的计算机上启用或限制了哪些内容

特别是当您自己的服务器上的注册表设置阻止连接时,我看到了类似的错误

除非你有一个很好的理由(比如你需要访问一个特定的网站),否则我会问你为什么要明确地支持它。两年前的数据表明98.7%的网站支持TLS1.0

除非你有很好的理由没有在最初的帖子中列出,否则为什么不做如下事情:

Uri uri = new Uri(url);
if (uri.Scheme != "https")
    throw new ArgumentException("must use https");

WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();

然后,它是未来变化的证据,比如TLS被破坏和弃用的那一天(希望从现在起很长一段时间)。此外,任何更改(如需要TLS1.2或完全删除SSLv3站点)都可以通过更改主机上的设置来完成,而不是重新部署代码。

首先,此行仅用于调试。ServicePointManager.ServerCertificateValidationCallback=委托{return true;};请不要将此代码投入生产。请使用此代码查看相关证书。ServicePointManager.ServerCertificateValidationCallback=新系统.Net.Security.RemoteCertificateValidationCallback((发件人、证书、链、ssl)=>{Console.WriteLine(“证书主题的ServerCertificateValidationCallback:'{0}',cert.Subject);System.Net.HttpWebRequest hwr=发送方为System.Net.HttpWebRequest;if(null!=hwr){SecurityShower.showtpwebrequest(hwr);}SecurityShower.ShowCertAndChain(cert,chain);返回true;};您可以在这里获得ShowCertAndChain代码:@granadaCoder,我使用过它,但我无法理解输出。因为我对证书和握手的知识不够。我如何使用它来解决这个问题?在web浏览器中尝试失败的URL会很有趣。试试看。我不建议使用“心脏流血版本”,我刚才提到过,可能失败的url使用旧版本。他正在实现客户端而不是服务器。。。