【问题标题】:Getting SSL/TLS error while scraping a secure website via C# and HttpWebRequest通过 C# 和 HttpWebRequest 抓取安全网站时出现 SSL/TLS 错误
【发布时间】:2020-01-19 17:49:52
【问题描述】:

我正在尝试编写 C# 代码以从安全网站(即 https://www.exampe.com)中抓取 html 代码。

我正在使用带有 .Net Framework 4.5.2 的 Visual Studio 2017。

这是我的代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    string html = reader.ReadToEnd();
}

运行上述代码时,在第 2 行出现以下错误,GetResponse()

请求中止:无法创建 SSL/TLS 安全通道

当我使用常规 HTTP URL 时,上面的代码可以正常工作。它只在 HTTPS 上中断。

PS:

  1. 这个网站是外部的,意思是在我们的网络之外,当我通过任何浏览器查看它时都可以正常工作。我认为它拥有所有必要的合法有效证书。

  2. 顺便说一下,当我在家中的另一台未连接到我公司网络的计算机上运行我的代码时,它运行良好。

请帮忙!

【问题讨论】:

  • 网站的证书是否有效(包括名称和日期)并由您计算机的根存储信任的有效 CA 机构签名?
  • 我尝试访问的网站不是我的网站,而是外部客户端网站。当我尝试通过任何已知浏览器查看该网站时,该网站运行良好。只有当我尝试通过 c# 访问它时它才会失败。所以回到你的问题,我会假设该网站拥有所有有效的证书。
  • 增加日志记录的详细程度并查看 TLS 握手的哪个部分出错。或者使用网络嗅探器,但这只会给你部分答案。 PS:混淆名称时请使用example.com,而不是其他虚构名称。
  • “当我尝试通过任何已知浏览器查看该网站时,该网站运行良好。” 这没有多大帮助,因为您的 Java 代码肯定没有使用与任何浏览器相同的信任库,所以如果问题是与证书验证及其使用的 CA 相关,您需要确保您的 java 代码使用的信任库具有相关的 CA 证书。 “我会假设该网站拥有所有有效证书。” TLS 不像您想象的那样工作,客户端必须根据本地内容验证远程证书。除其他外。
  • 帕特里克,感谢您的反馈。一般来说,我对 SSL/TLS 和证书真的很陌生。我以前从来没有处理过这些东西。我真的不确定我是否明白你的意思。为了让我的 C# 代码正常工作,我究竟需要做什么?

标签: c# asp.net security ssl


【解决方案1】:

这可能是 TLS 1.2 问题。你必须告诉 C# 使用 TLS 1.2:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

在您的请求之前添加此代码。

【讨论】:

  • 刚试过。我添加了这段代码,但我的应用仍然抛出了同样的错误。
【解决方案2】:

我找到了我的问题的答案。只需在创建请求之前添加以下代码行:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

... and the rest is same as I had originally.

现在我的应用运行良好!

谢谢!

【讨论】:

  • ....Simon 提出了这个建议。那么你为什么要发布一个单独的答案,为什么你告诉他这不起作用?此外 - 您只需在应用程序中运行这行代码一次。它将保持在 TLS 1.2 上,直到您的应用重新启动。因此,在您的应用程序的最开始运行它是最有意义的,例如您的 Main 方法、Application_Start 事件等。
  • 问题是,在他的解决方案中,他没有解释在哪里使用这行代码。我在创建 HttpWebRequest 后一直在尝试它,但它一直在抛出错误。然后我在一个论坛上发现有人建议在创建 HttpWebRequest 之前放置这行代码。这就是为什么我决定创建一个单独的帖子。但我仍然感谢他和其他所有人的帮助。非常感谢大家!
  • 它在他的回答中说得很清楚,把它放在请求之前
  • 你应该删除这个答案,接受西蒙的,并删除说它不起作用的评论。
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2018-06-17
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多