【问题标题】:Prevent error could not create SSL/TLS secure channel on some servers防止错误无法在某些服务器上创建 SSL/TLS 安全通道
【发布时间】:2020-03-17 13:56:21
【问题描述】:

我知道有很多关于此错误的引用,但尽管查看并尝试了许多建议的解决方案,但我仍在努力解决该问题。

该错误仅发生在某些机器上。它不会发生在我的开发机器和许多其他机器上,但我们能够在 Windows 2008 RS 服务器以及 Windows 2012R2 以及可能的其他机器上重复此操作。

我能够在受影响机器上的浏览器中访问该页面,因此这将排除缺少密码的情况(或者我被告知)。

每次我运行我的简单代码时,我都会在某些机器上遇到同样的错误:

请求被中止:无法创建 SSL/TLS 安全通道。

我的简单代码是这样的:

 Private Async Function CallRest() As Task

        Using http As HttpClient = New HttpClient()
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

            Dim url As String = "https://www.zeidman.info/appreg/resttest.php"

            Dim result = Await http.GetAsync(url)

            Dim content = Await result.Content.ReadAsStringAsync

            Console.WriteLine(content)
        End Using


    End Function

我已尝试添加:

ServicePointManager.Expect100Continue = True

出于测试目的,我尝试添加:

ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications

有相应的功能

Public Function AcceptAllCertifications(sender As Object,
    certification As System.Security.Cryptography.X509Certificates.X509Certificate,
    chain As System.Security.Cryptography.X509Certificates.X509Chain,
    sslPolicyErrors As Security.SslPolicyErrors) As Boolean


        Return True
    End Function

我也看到了这个answer 并使用了那个版本的 ServerCertificateValidationCallback 但代码甚至没有进入那个方法(我把日志放在里面)

question 中的一条评论建议使用 system.net 跟踪,尽管按照说明进行操作,但我无法让它显示任何输出。

非常欢迎任何建议。

【问题讨论】:

  • 第一件事:将ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 移动到所有内容之上(在创建 HttpClient 实例之前)。 2) .Net 4.5+ 必须安装在目标机器上。 3) 该站点仅使用 TLS12,密码套件为 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,这是默认的 TLS12 密码之一,可用于加密 SSL 握手中的对称密钥(不是仅签名密码)。 4) HSTS 被禁用,因此设置user-agent 标头不是严格要求,但无论如何都应该这样做,以实现通用兼容性。
  • 5) Web 浏览器可以连接到远程服务器无关紧要,浏览器可以使用自己的密码套件。 6) 同时需要 SHA 和 SHA-256:有时,某人或某物会在服务器上禁用 SHA(以强制安全。这是失败的)。如果您已经确定目标机器中可以使用 TLS12,建议您阅读此:SCHANNEL event logging 并下载此:Microsoft Message Analyzer 进行测试。
  • 附注:您应该使用静态 (Shared) HttpClient,手动 使用特定的 HttpClientHandler 设置默认值。应该管理ServerCertificateCustomValidationCallback、处理AllowAutoRedirectCookieContainer 的是HttpClientHandler。连接到网站时始终添加 CookieContainer。用户代理可以用[HttpClient].DefaultRequestHeaders.Add("User-Agent", "A not so recent User-Agent header") 指定。 不是最近,因为尚不支持 HSTS。
  • 这对于验证这些机器的系统更新状态也很有用:Update to enable TLS 1.1 and TLS 1.2 as default secure protocols in WinHTTP in Windows(适用于 Windows Server 2012、Windows 7 Service Pack 1 和 Windows Server 2008 R2 SP1)。跨度>
  • 这发生在基于 W7 操作系统中。我在这里写了另一个答案:stackoverflow.com/questions/58857996/…

标签: .net vb.net ssl


【解决方案1】:

我得到了这个工作。感谢 Jimi 的所有建议。很有帮助。

正是你的第 5 点让我重新思考。我在尝试连接的服务器上从SSL Labs 运行分析,发现只有四个密码可用。在我的 Win2008R2 客户端上,我使用 IISCrtypto 查看安装了哪些密码。我看到服务器上没有匹配项。我添加了丢失的密码,重新启动后就可以访问该站点了。

我看到的一件事是,在 Internet Explorer 无法访问该站点之前,但之后它可以,因此它显然使用了内置的 Windows 密码。

【讨论】:

  • 我很高兴你让它工作。了解您是否已确定这些密码丢失的原因会很有用。服务器没有更新?
  • 是的,我想是的。这是一个演示服务器,我们只是重复使用并且没有打补丁。报告问题的是我们的客户。
猜你喜欢
  • 2012-11-04
  • 2018-04-06
  • 2017-05-25
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多