【问题标题】:Ignore invalid SSL (version 3) certificate with XmlTextReader https request使用 XmlTextReader https 请求忽略无效的 SSL(版本 3)证书
【发布时间】:2012-07-13 11:09:04
【问题描述】:

我正在尝试从 https 网络请求创建 XML 文档,但是当站点的证书无效时,我无法让它工作。我希望我的应用程序不关心证书,我希望它无所畏惧地过着边缘的生活!

这是我拥有的初始代码,之前我曾多次使用它从标准 http(非 SSL)请求中获取我想要的内容:

XmlDocument xml = new XmlDocument();
XmlTextReader reader = new XmlTextReader("https://www.example.com");
xml.Load(reader);

由于网站的 SSL 证书无效,我现在收到以下错误:

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

现在我已经完成了我的谷歌搜索并尝试了一些有希望的解决方案,但似乎没有任何帮助。

我尝试过的here on SO 看起来不错,但似乎不起作用,我在上面的代码之前直接添加了“接受的答案”代码行,因为它不太清楚应该去哪里。

如果有什么不同,我的代码在类库中,我正在通过控制台应用程序进行测试。我也在使用 .Net 4。


这是我最近的尝试(不起作用):

XmlDocument xml = new XmlDocument();

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

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlCommand);
request.Credentials = CredentialCache.DefaultCredentials;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    using (Stream receiveStream = response.GetResponseStream())
    {
        XmlTextReader reader = new XmlTextReader(receiveStream);
        xml.Load(reader);
    }
}

【问题讨论】:

  • 只是大声思考:我对+= 感到困惑。将其更改为 = 对您有什么帮助吗?
  • @skrebbel:编译正常但运​​行时错误相同
  • @skrebbel:别担心,已排序;-)
  • 为什么?如果你不希望它是安全的,你为什么要使用 HTTPS?
  • @EJP - 有时您根本无法选择。有很多服务提供商向一些合作伙伴提供了一个 API,但这些 API 做得不够好。通常,这包括仅通过 HTTPS 提供它,但带有自签名证书。虽然在业务领域应该推动这些组织解决他们的证书问题,但仍然值得继续开发客户端以用于测试和演示目的 - 甚至可能是试点。

标签: c# ssl httpwebrequest


【解决方案1】:

好的,我找到了解决方案。我们选择尝试禁用服务器上的 SSL 进行测试,并注意到它使用的是 SSL 3。在另一次谷歌搜索后,我发现了一些额外的代码来解决这个问题(设置 SecurityProtocolType 很重要):

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

XmlDocument xml = new XmlDocument();
XmlTextReader reader = new XmlTextReader(urlCommand);
xml.Load(reader);

【讨论】:

  • 如果它是您自己的服务器,那么 EJP 对您的问题的评论更有意义 - 如果 HTTPS 无论如何都不安全,为什么还要这样做? :-)
  • @skrebbel:但它是否安全,证书是否无效,使用 ssl 加密连接无论哪种方式,总有好处
【解决方案2】:

嗯,也许 XmlTextReader 使用不同的方式访问 HTTPS。

尝试使用HttpWebRequest 发出网络请求,并将response.GetResponseStream() 传递给XML 文本阅读器(并将ServicePointManager.ServerCertificateValidationCallback 覆盖保留在原来的位置)

【讨论】:

  • 它只是在request.GetResponse() 上失败了
  • 这很奇怪。您能否编辑您的问题并粘贴新代码,包括来自其他问题已接受答案的行?
【解决方案3】:

出现此错误的原因:

您没有在您的网站上使用有效的客户端证书。

您可以尝试以下方法:

  • 为了快速转身,您可以尝试使用 http://_____ * 访问 URL - 不建议这样做,但您可以尝试进行测试。*

  • 因此,您没有使用有效的客户端证书,您可以编写如下内容:

    • 在您请求下载 XML 或发出一些 http 请求的位置添加此行。

    //添加Mock证书验证

    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnValidationCallback);

  • 在下面添加为全局方法:

    public static bool OnValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) { 返回真; }

【讨论】:

  • 您建议的解决方案已经出现在问题中,明确指出它不能解决问题。
  • 我总是尝试使用上面的代码,它适用于大多数场景。在我的代码中,不同之处在于 OnValidationCallback 方法是全局声明的,它为证书验证添加了所需的命名空间。我在您的场景中看到 Ssl3 正在播放。感谢您对此进行通知。
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2011-05-28
  • 2019-01-16
  • 2016-08-04
  • 2014-10-12
相关资源
最近更新 更多