【问题标题】:Forcing HttpClient to enforce TSL higher than 1.0强制 HttpClient 强制 TSL 高于 1.0
【发布时间】:2020-03-10 11:36:27
【问题描述】:

我的 WPF 应用程序连接到 Azure Web API。端点将被配置为拒绝访问任何非安全 (HTTP) 或弱安全(具有 TLS 1.0 或更早版本的 HTTPS)请求。但我也希望我的应用永远不要尝试发送非安全或弱安全请求。

Microsoft 建议 herethere 以 Framework 4.7 为目标,并将 ServicePointManager.SecurityProtocol 保留为其默认值,以便操作系统确定要使用的协议。

我提到的第二篇文章也表明 Windows 7 将依赖 TLS 1.0,在强烈建议不要依赖 TLS 1.0 之后仅几行。所以我知道我可以相信操作系统可以获得它可用的最佳安全层,但如果最好的选择仍然是错误的选择,我不能相信操作系统不会发送请求。

我的应用依赖于System.Net.Http.HttpClient。我想确保我通过此客户端拨打的电话是:

  1. 始终安全。也就是说,始终使用 HTTPS,永远不要使用 HTTP。
  2. 始终固定到足够的水平。也就是说,至少依赖 TLS 1.1;但绝不是 TLS 1.0 或 SSL。

我怎样才能做到这一点?

  • 对于第 1 点,我已阅读我应该在创建 URI 对象时简单地指定“https://”;总是这样吗?
  • 对于第 2 点,我可以按位组合所有 SecurityProtocolType enum,不包括 .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。我的问题是关于明确排除某些协议,以防操作系统配置不够挑剔。
  • 参见此处的注释:Which TLS version was negotiated?
  • SystemDefault 返回系统的默认设置。你可以使用或不使用,这是你的选择。如果系统的默认值尚未更新到正在使用的框架支持的版本,则可能有必要忽略它,从而导致应用程序在大多数 https 连接可以正常工作时失败。检查系统默认值:如果它低于你所知道的框架和你的代码可以支持的,强制一个特定的协议版本(TLS1.2 或更高版本)并且还支持这个选择的后果(远程服务器证书的验证,例如。)

标签: c# .net vb.net security https


【解决方案1】:

正如开发人员在 HttpClient 协商从操作系统传递的 TLS 之前所说的那样。特别是在 W7 中,默认情况下未启用以允许应用程序正确使用它。 为了解决这个问题,如果您不想在运行您的应用程序的机器上更新 .NET 框架,或者您没有在操作系统上进行任何更新,您需要更新注册表中的一些键。您可以通过 VB.Net 中的代码来实现。在下面的示例中,我想向您展示需要更新/设置的键。 此外,如果您获得此代码并创建一个 .reg 文件并尝试执行,您可以解决您的机器中的问题,但对于分布式应用程序,您需要通过安装应用程序的每台机器上的代码来执行此操作。 请注意,标签v2.0.50727 或标签v4.0.30319 是机器上安装的.Net 框架的版本。这意味着您必须在安装版本之前知道(您也可以通过注册表或代码获取)以及您的应用程序是否在其中一个版本中编译。您只能更新您的应用所使用的版本。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

【讨论】:

  • 我不会负责更改我客户机器上的安全设置。我只想在机器上可用的协议中采用最安全的协议。如果最安全的是低于 TLS1.1,那么我会阻止该过程,显示警告消息并要求他们与 IT 取得联系。
  • 即使(在这种情况下)您以“更好”的方式更改安全设置,您的作案方式也是正确的。 :)
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2013-06-03
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多