错误:C# 底层连接关闭:无法建立 SSL/TLS 安全通道的信任关系。

43

我正在尝试通过SSL发出请求。 证书已经安装在计算机上,并且可以通过浏览器使用。

我正在使用这个请求:

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] data = encoding.GetBytes(request.Content.OuterXml.ToString());
string password = "XXXX";
X509Certificate2 cert = new X509Certificate2("c:\\zzzz.p12", password);
string key = cert.GetPublicKeyString();
string certData = Encoding.ASCII.GetString(cert.Export(X509ContentType.Cert));

Uri uri = new Uri(request.Url);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(uri);
myRequest.Credentials = new NetworkCredential(request.User, request.Password.ToString());
myRequest.Method = "PUT";
myRequest.ContentType = request.ContentType;
myRequest.ContentLength = data.Length;
myRequest.ClientCertificates.Add(cert);

Stream newStream = myRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();

System.IO.StreamReader st = new StreamReader(((HttpWebResponse)myRequest.GetResponse()).GetResponseStream());

使用这段代码时,我得到了如下错误:

基础连接已关闭: 无法建立 SSL/TLS 安全通道的信任关系。 ---> System.Security.Authentication.AuthenticationException: 根据验证过程,远程证书无效。

问题出在哪里?


1
看一下这篇帖子,也许可以帮助你:https://dev59.com/wXRB5IYBdhLWcg3wJkhC - JohnnBlade
可能是C#忽略证书错误?的重复问题。 - Kristopher Johnson
在Exchange Web Services(EWS)的情况下,微软推荐的解决方案在这里:https://msdn.microsoft.com/en-us/library/bb408523.aspx - RenniePet
4个回答

112

我用这个方法解决了问题:

ServicePointManager.ServerCertificateValidationCallback = new        
RemoteCertificateValidationCallback
(
   delegate { return true; }
);

31
如果您关闭SSL证书验证,此解决方案可能成为潜在的安全威胁。如果这是生产代码,请了解您正在连接的服务器的风险。 - Amzath
这个在Windows Phone 8中该怎么做?ServicePointManager不在参考文献中。http://cmsresources.windowsphone.com/devcenter/en-us/downloads/064028-microsoft-poster.pdf - MLProgrammer-CiM
3
当我通过 Fiddler 将请求从我的应用程序引导时,遇到了这个问题。通过添加委托技巧来不验证证书,帮助我成功运行调用,并在 Fiddler 中看到响应。 - Philippe Monnet
3
我下投票反对了,因为正如@Amzath所说,这样会规避安全措施。更好的方法是从根本上解决问题(有点双关语)。 - bvgheluwe
@Roger G,收到!感谢您回答自己的问题和我的问题。我都点了赞。 - Liviu Sosu
显示剩余4条评论

2

确保您的证书被正确地信任。是否已将根证书添加到正确的证书存储(本地计算机上的受信任的根CA)?

当自制的根证书用于签名证书,并被添加到了当前用户的受信任的根CA中时,我遇到了此错误。将根证书移动到本地计算机上的根CA存储解决了我的问题。


0

在调用 Web 方法的函数中,您可以添加以下语句:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });


-1

这是客户端代码,对吧?而且你正在访问一个HTTPS的URL,是吗? 我认为问题出在服务器证书上,客户端TLS栈无法验证。 当你通过浏览器连接到该URL时,是否顺畅工作或者看到证书不匹配的警告?


是的,这是客户端代码。是的,我通过https访问。当我在浏览器中连接时,它运行顺畅,没有看到任何警告。 - Roger G
1
如果您熟悉网络分析器(例如Wireshark或NetMon),您可以简单地嗅探流量并查看您实际上正在与哪个主机通信,它提供了什么证书以及TLS握手是否完成并且是否存在错误。 否则,您所获得的参考链接是一个很好的开始。 如果这不能帮助您,您可以在此处逐渐披露更多有关您设置的详细信息(您正在访问的URL,服务器上安装的证书,网络配置-代理等)。 - Vladik Branevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接