【发布时间】:2020-03-10 11:36:27
【问题描述】:
我的 WPF 应用程序连接到 Azure Web API。端点将被配置为拒绝访问任何非安全 (HTTP) 或弱安全(具有 TLS 1.0 或更早版本的 HTTPS)请求。但我也希望我的应用永远不要尝试发送非安全或弱安全请求。
Microsoft 建议 here 和 there 以 Framework 4.7 为目标,并将 ServicePointManager.SecurityProtocol 保留为其默认值,以便操作系统确定要使用的协议。
我提到的第二篇文章也表明 Windows 7 将依赖 TLS 1.0,在强烈建议不要依赖 TLS 1.0 之后仅几行。所以我知道我可以相信操作系统可以获得它可用的最佳安全层,但如果最好的选择仍然是错误的选择,我不能相信操作系统不会发送请求。
我的应用依赖于System.Net.Http.HttpClient。我想确保我通过此客户端拨打的电话是:
- 始终安全。也就是说,始终使用 HTTPS,永远不要使用 HTTP。
- 始终固定到足够的水平。也就是说,至少依赖 TLS 1.1;但绝不是 TLS 1.0 或 SSL。
我怎样才能做到这一点?
- 对于第 1 点,我已阅读我应该在创建 URI 对象时简单地指定“https://”;总是这样吗?
- 对于第 2 点,我可以按位组合所有
SecurityProtocolTypeenum,不包括.ssl3和.Tls,但这也将排除任何未来的技术(TLS1.4?)。现在.SystemDefault字段已添加到枚举中,this answer 仍然正确吗?
【问题讨论】:
-
HttpClient 已经从操作系统中配置的最高版本开始协商。这是推荐的工作方式,所以当 TLS1.3 出来时,HttpClient 将开始使用它。您使用的是什么操作系统?
-
Windows 7 默认为 SSL3 和 TLS1.0,直到最近的更新,其中默认已提升为 TLS1.2 并添加了 TLS1.3 支持。 Windows 10 默认为 TLS 1.2。当平台是 Windows 7 时,您可能不想依赖用户可能安装或未安装的系统更新。您可以直接指定要支持的
SecurityProtocolType,设置ServicePointManager.SecurityProtocol。如果你不这样做,如果系统没有更新,你的应用程序就根本无法工作。它可能是您想要的(通知失败)或不是。 -
Evkaristw Panagiotis。我的问题是关于明确排除某些协议,以防操作系统配置不够挑剔。
-
SystemDefault返回系统的默认设置。你可以使用或不使用,这是你的选择。如果系统的默认值尚未更新到正在使用的框架支持的版本,则可能有必要忽略它,从而导致应用程序在大多数 https 连接可以正常工作时失败。检查系统默认值:如果它低于你所知道的框架和你的代码可以支持的,强制一个特定的协议版本(TLS1.2 或更高版本)并且还支持这个选择的后果(远程服务器证书的验证,例如。)
标签: c# .net vb.net security https