我正在尝试从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);
}
}
答案 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 - 不建议这样做,但为了进行测试,您可以尝试。*
您没有使用有效的客户端证书,因此,您可以编写如下内容:
//添加Mock证书验证
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnValidationCallback);
添加以下作为全局方法:
public static bool OnValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors 错误) { 返回真; }