【发布时间】:2019-02-17 04:40:19
【问题描述】:
希望有人可以帮助解决这个问题。最近我们的机器更新了 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();
从机器上卸载安全更新后,代码可以正常执行。我们在上面的代码中遗漏了什么吗?这是我唯一能想到的。
非常感谢任何帮助!
【问题讨论】:
-
TLS 1.1 由于安全漏洞而被贬值,您是否尝试过从安全协议中删除该标志?
-
继续前进,您可能希望将其设为
ServicePointManager.SecurityProtocol = SecurityProtocol.SystemDefault(从 4.7 开始),因此您不必在引入和弃用版本时推出新代码。如果主机不是最新的,这可能仍会导致连接问题,但仅靠代码无法解决这个问题。 -
据我所知,
ServicePointManager.SecurityProtocol在Create()调用期间被访问/复制。 之后进行更改应该没有明显的效果(在应用任何修复之前或之后) -
Damien 的评论很贴切:行在它所在的位置,只有应用程序中的 second 请求应该获取设置;在更改之前创建的 Web 请求将复制现有设置。这在实践中可能会或可能不会被注意到,这取决于您的应用程序实际发出请求的方式,但无论如何它仍然不是您想要的。这可能不是这个问题的原因,但它仍然令人困惑。