【问题标题】:SSL/TSL Secure Channel exception while sending HttpWebRequest发送 HttpWebRequest 时出现 SSL/TLS 安全通道异常
【发布时间】:2017-03-22 16:31:57
【问题描述】:

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

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

【问题讨论】:

  • 首先,此行仅用于调试。 ServicePointManager.ServerCertificateValidationCallback = 委托 { 返回真; };请不要将此代码投入生产。
  • 使用此代码查看有问题的证书。 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(( sender, cert, chain, ssl) => { Console.WriteLine("ServerCertificateValidationCallback for Cert.Subject : '{0}'", cert.Subject); System. Net.HttpWebRequest hwr = sender as System.Net.HttpWebRequest; if (null != hwr) { SecurityShower.ShowHttpWebRequest(hwr); } SecurityShower.ShowCertAndChain(cert, chain); return true; });
  • 您可以在此处获取 ShowCertAndChain 代码:granadacoder.wordpress.com/2016/11/04/…
  • @granadaCoder,我用过,但我无法理解输出。因为我对证书和握手的了解不够。如何使用它来解决问题?
  • 在网络浏览器中尝试失败的 URL 会很有趣。试试看。

标签: c# https get httpwebrequest


【解决方案1】:

如果您在使用不同的网址时遇到此问题: 您正在强制使用 Http 1.0。目前,Http 1.0、1.1 和 2. 可用。愿你不应该用 Http 1.0 来限制你自己。 还有一些服务器仍然使用旧的 SSL 版本,所以您可能想添加对它们的支持...

【讨论】:

  • 我不建议使用“Heart Bleed 版本”,我刚才提到了,可能失败的 url 使用旧版本。他正在实现客户端而不是服务器......
【解决方案2】:

我不确定从您发布的代码中诊断具体问题,但我认为您可以更笼统地说明您的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 站点)都可以通过更改主机上的设置来完成,而不是重新部署代码。

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2023-04-08
    • 2014-12-18
    • 2020-01-19
    • 2021-02-27
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多