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