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

Mar*_*rek 64 c# ssl https

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

这是我的示例代码,我是基于这个解决方案编写的: 使用HttpClient C 允许不受信任的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));
}
Run Code Online (Sandbox Code Playgroud)

还试过这个:

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...
Run Code Online (Sandbox Code Playgroud)

还有这个

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Run Code Online (Sandbox Code Playgroud)

但每次我都有例外:

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: 
Run Code Online (Sandbox Code Playgroud)

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

Wap*_*pac 124

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

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

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

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!在这方面挣扎了 3 个小时。添加这一行为我做了:`ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;` (3认同)
  • 请注意,较新版本的 .NET 默认启用此功能,我们所需要做的就是将 .NET 版本设置为 4.6.1 (2认同)

mar*_*ico 16

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

4.5.2对于我们上述问题不起作用,而4.6.1则问题

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)


小智 12

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

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

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)

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

无论如何 - 如果你仍然遇到一些旧网站/服务器,那么值得尝试一下.

  • @Jeff-查看链接的文章。我认为这可以解释为什么Ssl3无法正常工作,并提出了两种重新启用Ssl3的方法。https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/mitigation-tls-protocols (2认同)

use*_*690 6

移动此行:ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | 安全协议类型.Tls | 安全协议类型.Tls11 | 安全协议类型.Tls12;

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

原帖:KB4344167 安全更新破坏了 TLS 代码


vak*_*vak 6

我使用 .NET 版本 4.8 并在 HttpClient 初始化期间指定 SSL 协议帮助我解决了此问题,如下所示。

var client = new HttpClient(new HttpClientHandler { SslProtocols = SslProtocols.Tls12});
Run Code Online (Sandbox Code Playgroud)