希望有人可以帮助解决这个问题。 最近,我们的计算机更新了KB4344167其中包括.NET 4.7.1的安全更新。不幸的是,此更新破坏了我们的代码Webrequest
。 当我们运行下面的代码时,我们收到此错误:
请求已中止:无法创建 SSL/TLS 安全通道。
// Create a request for the URL.
WebRequest request = WebRequest.Create(url);
//specify to use TLS 1.2 as default connection
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
request.Timeout = int.Parse(configmanager.GetSetting("Webtimeout"));
// Set proxy
request.Proxy = WebRequest.DefaultWebProxy;
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
// Define a cache policy for this request only.
HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
// Get the response.
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
从计算机卸载安全更新时,代码执行正常。 我们在上面的代码中遗漏了一些东西吗? 这是我唯一能想到的。
任何帮助将不胜感激!
@Damien_The_Unbeliever给出了正确的答案。 最终的问题出在ServicePointManager和Webrequest.Create的顺序上。 反转这些行,因此在 Webrequest.Create 之前定义了 ServicePointManager,解决了这个问题。 我仍然不知道为什么在创建后添加ServicePointManager修复了我们的服务器移动到TLS 1.2时的原始问题,但我们现在不会担心这一点。
我遇到了类似的事情。 看来MS可能在尝试仅启用TLS 1.2时破坏了一些东西。 https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect
到目前为止,我已经尝试将建议的配置添加到 app.config 中,它就像一个魅力。 不再有 SSL/TLS 错误。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>
注意:我们在有选择地修补的服务器上发现了这个问题,即它们还没有MS修复程序。 我们的开发机器从未发现过这个问题。