尽pipe设置了ServerCertificateValidationCallback,但无法创buildSSL / TLS安全通道

我试图build立SSL / TLS连接到自签名证书的testing服务器 。 通过不安全的渠道进行沟通没有问题。

这里是我的示例代码,我已经写了基于这个解决scheme: 使用HttpClient C# 允许Untrusted SSL证书 忽略证书错误? .NET客户端连接到ssl Web API

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; var c = new HttpClient(); var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result; if (r.IsSuccessStatusCode) { Log.AddMessage(r.Content.Get<string>()); } else { Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase)); } 

也试过这个:

 var handler = new WebRequestHandler(); handler.ServerCertificateValidationCallback = delegate { return true; }; var c = new HttpClient(handler); ... 

和这个

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

但每次我有一个例外:

 InnerException: System.Net.Http.HttpRequestException _HResult=-2146233088 _message=An error occurred while sending the request. HResult=-2146233088 IsTransient=false Message=An error occurred while sending the request. InnerException: System.Net.WebException _HResult=-2146233079 _message=The request was aborted: Could not create SSL/TLS secure channel. HResult=-2146233079 IsTransient=false Message=The request was aborted: Could not create SSL/TLS secure channel. Source=System StackTrace: at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) InnerException: 

我做错了什么? 为什么我无法连接到此服务器(其中包含无效的自签名证书)

你正在用ServerCertificateValidationCallback正确地做。 这不是你正面临的问题。 您面临的问题很可能是SSL / TLS协议的版本。

例如,如果您的服务器仅提供SSLv3和TLSv10,并且您的客户端需要TLSv12,那么您将收到此错误消息。 你需要做的是确保客户端和服务器都支持一个通用的协议版本。

当我需要能够连接尽可能多的服务器(而不是尽可能安全)的客户端时,我使用这个(连同设置validationcallback):

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

就像任何人仍然遇到这种情况 – 我已经添加了解决scheme中提到的ServicePointManager.SecurityProfile选项:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

然而,我仍然得到相同的“请求被中止:无法创buildSSL / TLS安全通道”错误。 我试图连接到一些使用HTTPS SOAP API接口的老式语音服务器(例如语音邮件,IP电话系统等等,几年前安装)。 这些只支持SSL3连接,因为它们是在几年前更新的。

有人会认为在SecurityProtocols列表中包含SSl3会在这里做到这一点,但事实并非如此。 我可以强制连接的唯一方法是仅包含Ssl3协议,不包含其他协议:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

然后连接通过 – 看起来像一个错误,但直到最近我没有开始抛出错误,直到最近我为这些服务器提供了多年的工具 – 我相信微软已经开始推出更新这个系统的变化行为强制TLS连接,除非没有其他的select。

无论如何 – 如果你仍然遇到一些旧的网站/服务器,这是值得一试的。

我们今天一直在解决同样的问题,所有你需要做的就是增加.NET的运行时版本

上述问题4.5.2没有为我们工作 ,而4.6.1是好的

如果您需要保持.NET版本,然后设置

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

如果您使用的是新域名,并且您已经完成了上述所有操作,并且仍然收到相同的错误,请检查您是否清除了PC上的DNScaching。 清除您的DNS了解更多详情。