发送HttpWebRequest时发生SSL / TSL安全通道异常

时间:2016-11-08 22:05:35

标签: c# https get httpwebrequest

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

我的方法:

    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安全通道。但它并不总是扔掉它。有时文件下载成功,有时会抛出此异常。我不知道通过它的正确方法是什么。

那么如何解决这个问题呢?答案

2 个答案:

答案 0 :(得分:0)

如果您遇到不同网址的此问题: 你正在强迫Http 1.0。可以,Http 1.0,1.1和2.可用。也许你不应该用Http 1.0来限制自己。 此外,一些服务器仍然使用旧的SSL版本,因此您可能希望添加对它们的支持......

答案 1 :(得分:0)

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

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

SSL3 is broken除非您有充分的理由(即您需要访问的特定网站),否则我会质疑为什么您明确要支持它。这个来自2年前的interesting blog表明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站点)都可以通过更改主机上的设置来完成,而不是重新部署代码。