尽管设置了ServerCertificateValidationCallback,但无法创建SSL / TLS安全通道

时间:2015-10-07 14:07:06

标签: c# ssl https

我尝试与使用自签名证书的测试服务器建立SSL / TLS连接。通过不安全的渠道进行沟通没有问题。

以下是我根据此解决方案编写的示例代码: Allowing Untrusted SSL Certificates with HttpClient C# Ignore certificate errors? .NET client connecting to 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: 

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

9 个答案:

答案 0 :(得分:111)

您正在使用ServerCertificateValidationCallback正确执行此操作。这不是您面临的问题。您遇到的问题很可能是SSL / TLS协议的版本。

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

当我需要一个能够连接到尽可能多的服务器的客户端(而不是尽可能安全)时,我使用它(连同设置验证回调):

Table

答案 1 :(得分:11)

正如对任何仍然遇到此问题的人采取后续行动一样 - 我已经添加了解决方案中提到的ServicePointManager.SecurityProfile选项:

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

然而我继续得到相同的“请求被中止:无法创建SSL / TLS安全通道”错误。我试图使用HTTPS SOAP API接口(即多年前安装的语音邮件,IP电话系统等)连接到一些较旧的语音服务器。这些仅支持SSL3连接,因为它们最近几年前更新过。

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

然后连接通过 - 对我来说似乎是一个错误,但直到最近我才为这些已经存在多年的服务器提供的工具才开始抛出错误 - 我相信微软已经开始推出系统更改了已更新此行为以强制TLS连接,除非没有其他替代方法。

无论如何 - 如果你仍然对某些旧网站/服务器遇到这种情况,那么值得一试。

答案 2 :(得分:11)

我们刚刚解决了同样的问题,您需要做的就是增加.NET的运行时版本

对于我们上述问题,

4.5.2无法正常工作,而 4.6.1则可以

如果您需要保留.NET版本,请设置

var myId = firebase.auth().currentUser.uid;
        var ref = firebase.database().ref('/accounts/' + myId + '/discussions/');
        ref.orderByChild("timestamp").on("value", function(snapshot1) {
          this.data = [];
          snapshot1.forEach(function(child) {
          this.data.push(child.val());
        }.bind(this));

          $timeout(function(){
          $scope.discussions = this.data.reverse() ;

          })
        })

答案 3 :(得分:1)

在我的情况下,客户端和服务器上都启用了TLS1_2,但是服务器使用的是MD5,而客户端禁用了它。因此,请在http://ssllabs.com上测试客户端和服务器,或者使用openssl / s_client进行测试以查看发生了什么。另外,使用Wireshark检查选定的密码。

答案 4 :(得分:1)

TLS 1.0和1.1现已终止。我们的Amazon Web服务器上的软件包已更新,我们开始收到此错误。

答案已在上方,但您不应再使用tlstls11

专门针对ASP.Net,将其添加到您的一种启动方法中。

        public Startup()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;

但是我敢肯定,在其他许多情况下,类似的事情也会起作用。

答案 5 :(得分:0)

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

Windows®8

要在使用Windows 8时清除DNS缓存,请执行以下步骤:

在键盘上,按Win + X打开WinX菜单。

右键单击“命令提示符”,然后选择“以管理员身份运行”。

运行以下命令:

ipconfig / flushdns

如果命令成功,系统将返回以下消息:

Windows IP配置成功刷新了DNS解析器缓存。

Windows®7

要在使用Windows 7时清除DNS缓存,请执行以下步骤:

点击开始。

在“开始”菜单搜索文本框中输入cmd。

右键单击“命令提示符”,然后选择“以管理员身份运行”。

运行以下命令:

ipconfig / flushdns

如果命令成功,系统将返回以下消息: Windows IP配置成功刷新了DNS解析器缓存。

答案 6 :(得分:0)

移动此行:ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

在此行之前:HttpWebRequest request =(HttpWebRequest)WebRequest.Create(uri);

原始帖子:KB4344167 security update breaks TLS Code

答案 7 :(得分:0)

我遇到此线程是因为我也遇到错误无法创建SSL / TLS安全通道。就我而言,我试图使用{{1从PowerShell中访问Siebel配置REST API }},以上建议均无济于事。

最终,我偶然发现了问题的原因:我正在联系的服务器需要客户端证书认证。

要使呼叫正常工作,我必须向客户端证书(包括私钥)提供Invoke-RestMethod参数:

-Certificate

希望我的经验可以对其他有我这个问题风味的人有所帮助。

答案 8 :(得分:0)

如果您在安全协议中仅指定 TLS,则可以完美运行。

 try
            {
                ServicePointManager.Expect100Continue = true;
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

                ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

                var webClient = new WebClient();

                var s = webClient.DownloadString("https://google.com");

                Console.WriteLine(s);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            Console.ReadLine();