使用XmlTextReader https请求忽略无效的SSL(版本3)证书

时间:2012-07-13 11:09:05

标签: c# ssl httpwebrequest

我正在尝试从https网络请求创建XML文档,但是当网站的证书无效时,我无法使其工作。我希望我的应用程序不关心证书,我希望它能够让生活在边缘而不用担心!

以下是我的初始代码,我之前用过的代码可以从标准的http(非SSL)请求获得我想要的内容:

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

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

  

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

现在我已经完成了我的Google-ing并尝试了许多有前景的解决方案,但似乎没有任何帮助。

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

如果它有任何区别,我的代码在类库中,我正在通过控制台应用程序进行测试。我也在使用.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);
    }
}

3 个答案:

答案 0 :(得分:2)

好的,所以我找到了解决方案。我们选择尝试在服务器上禁用SSL进行测试,并发现它使用的是SSL 3.经过另一次Google搜索后,我发现了一些其他代码来解决问题(设置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);

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

此错误的原因:

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

您可以尝试以下操作:

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

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

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

    //添加Mock证书验证

    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnValidationCallback);

  • 添加以下作为全局方法:

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