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

Posted

技术标签:

【中文标题】错误:C# 底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系【英文标题】:Error: C# The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel 【发布时间】:2012-06-28 16:21:19 【问题描述】:

我正在尝试通过 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:远程 根据验证程序,证书无效。

有什么问题?

【问题讨论】:

看看这篇文章,也许它可以帮助你***.com/questions/703272/… C# Ignore certificate errors?的可能重复 对于 Exchange Web Services (EWS),微软推荐的解决方案在这里:msdn.microsoft.com/en-us/library/bb408523.aspx 【参考方案1】:

我解决了这个问题:

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

【讨论】:

当您关闭 SSL 证书验证时,此解决方案可能会带来潜在的安全威胁。如果这是生产代码,请了解您连接到的服务器的风险。 如何在 Windows Phone 8 中做到这一点? ServicePointManager 不在参考cmsresources.windowsphone.com/devcenter/en-us/downloads/… 当我通过 Fiddler 汇集来自我的应用程序的请求时,我遇到了这个问题。添加代理技巧以不验证证书帮助我成功运行我的呼叫,以及在 Fiddler 中查看响应。 我投了反对票,因为正如@Amzath 所说,这绕过了安全性。最好从根本上解决问题(双关语)。 有人能贴出使用ServicePointManger代码发出请求的完整代码sn-p吗?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

是的,这是一个客户端代码。是的,我通过 https 访问。当我在浏览器中连接时,它工作顺利,没有看到任何警告.. 如果您对网络分析器(例如,NetMon 的 Wireshark)感到满意,您可以简单地嗅探您的流量并查看您真正在与哪个主机通信,它提供什么证书以及 TLS 握手是否完成或没有错误。否则,您获得的参考链接是一个好的开始。如果这对您没有帮助,您可以开始在此处泄漏更多设置的详细信息(您正在访问的 URL、服务器上安装的证书、网络配置 - 代理等)

以上是关于错误:C# 底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系的主要内容,如果未能解决你的问题,请参考以下文章

https 请求:底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系

无法从Dropbox下载文件,因为无法通过C#中的WebClient与SSL / TLS通道连接

无法使用主题备用名称证书为 SSL/TLS 安全通道建立信任关系

C# 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

[C#]基础连接已经关闭 未能为 SSL/TLS 安全通道建立信任关系

C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。