【发布时间】: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、处理AllowAutoRedirect和CookieContainer的是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/…