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

本文关键字:安全 通道 异常 TSL HttpWebRequest SSL 发送 | 更新日期: 2023-09-27 18:16:56

我在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()行抛出Could not create SSL/TSL secure channel。但它并不总是扔出去。有时文件下载成功,有时会抛出此异常。我不知道怎样才能度过难关。

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

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

如果您在不同的url上遇到此问题:您正在强制使用Http 1.0。目前,Http 1.0、1.1和2。可用。希望您不要用Http 1.0限制自己。还有一些服务器仍然使用旧的SSL版本,所以你可能想要增加对它们的支持…

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

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

SSL3是坏的,除非你有一个很好的理由(即一个特定的网站,你需要访问),然后我会质疑为什么你明确地想要支持它。这个两年前的有趣的博客表明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站点,都可以通过更改主机上的设置来完成,而不是重新部署代码。