【问题标题】:C# Get xml site over SSL/TLS - https://C# 通过 SSL/TLS 获取 xml 站点 - https://
【发布时间】:2012-04-19 15:20:29
【问题描述】:

我需要能够在控制台程序中从 https 网站读取 xml/rss。

到目前为止,我的程序支持纯 http,我一直在四处寻找,但似乎找不到一种简单的方法来实现对 https 的支持。 该站点是否具有有效证书并不重要,但我会很乐意获得有关如何检查这些证书的提示。

我可能对此不太了解,因此请提供任何提示!

我目前为 http 做的是:

XmlTextReader rssReader;
XmlDocument rssDoc;
rssReader = new XmlTextReader(url);
rssDoc = new XmlDocument();
rssDoc.Load(rssReader);

在没有受信任证书的站点上尝试此操作时,我收到一条错误消息: “底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。”

string url = "https://somesite.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();

我的程序需要同时支持受信任和不受信任的 https 站点。

程序在服务器上运行,因此必须在代码中处理不受信任的 https 站点。

【问题讨论】:

  • 如果你在 url 中将 "s" 添加到 "http" 会发生什么?只需将其从“http”更改为“https”?如果该站点具有受信任的证书,它应该可以正常工作。如果不是,您需要对遇到的任何错误进行故障排除。
  • 我正在测试的站点没有受信任的证书。而且我的代码需要同时支持这两者.....
  • 您遇到了哪个错误或行为是什么?如果您需要“处理证书”错误,这是一个/不同的问题
  • 如果证书不受信任,则解决方法是显式信任运行控制台应用程序的计算机上的证书。为此,请在 Internet Explorer 中打开 URL,然后从那里安装它。这里有说明:m86security.com/KB/KnowledgebaseArticle13446.aspx(步骤可能会因 I.E. 的版本而异)

标签: c# xml https rss ssl-certificate


【解决方案1】:

对于证书问题,请尝试以下...

ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback((s, ce, ch, ssl) => true);

...在开始的某个地方 - 或在执行请求之前。

这基本上是无条件地验证任何证书,有点简化。

编辑:这是“盲目”信任(并且对您的应用具有全局性)- 正确的实施将处理参数- 或需要实施 ICertificatePolicy 以专门处理不同的主机/证书。

编辑(证书):关于证书和 SSL 的实际工作方式 - 与上述相关(基于 cmets/discussion)...

http://www.verisign.com/ssl/ssl-information-center/how-ssl-security-works/index.html
How does SSL really work?
https://superuser.com/questions/84572/public-key-encryption

【讨论】:

  • 这可以是:ServicePointManager.ServerCertificateValidationCallback = (s, ce, ch, ssl) => true;
  • @Porges :) 当然 - 这是一个风格问题,这是以前的一段旧代码,当我们用来指定委托等时。但同意
  • 哇!就是这么简单!谢谢! :) 你介意解释一下这是做什么的吗?对我来说它看起来像一个事件处理程序?
  • 是的,它以自定义方式处理证书验证 - '应用程序可以将 ServerCertificateValidationCallback 属性设置为用于客户端自定义验证服务器证书的方法'来自'msdn.microsoft.com/en-us/library/…' .如果出现问题,它就会失败(问题可能是由于证书过期/无效等),您需要按照这些方式处理。
  • 有点违背证书的至少部分目的,不是吗?该证书不仅提供加密 (https),​​还有助于防止中间攻击,恶意网站拦截请求并更改数据。盲目地信任所有证书会带走证书的那部分目的,不是吗?专门安装并因此信任那些证书不是更有意义吗?
【解决方案2】:

您必须发送HttpWebRequest 或使用HttpClient。两者都是为建立/协商这些连接而设计的。

可能的欺骗:How to load xml from https using XmlTextReader

How do I use WebRequest to access an SSL encrypted site using https?

HttpWebRequest with https in C#

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2020-01-19
    • 2017-08-09
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多