【问题标题】:Is TLS 1.1 and TLS 1.2 enabled by default for .NET 4.5 and .NET 4.5.1?.NET 4.5 和 .NET 4.5.1 是否默认启用 TLS 1.1 和 TLS 1.2?
【发布时间】:2016-04-27 12:03:16
【问题描述】:

在我们的 Windows 2012 Server R2 上,我们需要禁用 TLS 1.0。

但是,我们正在运行 .NET 4.5 Wcf 服务。我们发现,如果我们禁用 TLS 1.0,WCF 服务将不再运行,因为我们收到错误“现有连接被远程主机强制关闭”。

.NET 4.5 和 .NET 4.5.1 是否默认启用 TLS 1.1/1.2?如果不是,我们假设是这种情况,在我们的 WCF 项目中,我们在哪里强制项目使用 TLS 1.1/1.2?

【问题讨论】:

标签: c# .net wcf ssl tls1.2


【解决方案1】:

.NET 4.5 和 .NET 4.5.1 是否默认启用 TLS 1.1/1.2?

没有。为各种框架版本启用的默认协议是:

  • .NET Framework 4.5 和 4.5.1:SSLv3 和 TLSv1
  • .NET Framework 4.5.2:SSLv3、TLSv1 和 TLSv1.1
  • .NET Framework 4.6 及更高版本:TLSv1、TLSv1.1 和 TLS1.2

来源:[1] [2] [3]

而微软recommends against explicitly specifying protocol versions 赞成使用操作系统的默认值:

为确保 .NET Framework 应用程序保持安全,TLS 版本应该进行硬编码。 .NET Framework 应用程序应使用操作系统 (OS) 支持的 TLS 版本。

...仍然可以通过使用ServicePointManager 类来选择您的应用程序支持的协议,特别是将SecurityProtocol 属性设置为相关的SecurityProtocolTypes。

在您的情况下,您需要使用以下内容:

System.Net.ServicePointManager.SecurityProtocol =
    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

请注意,自 2020 年起,TLSv1 和 TLSv1.1 已被有效弃用;您应该避免构建依赖这些协议的新应用程序,并尽一切努力升级当前使用它们的应用程序。

【讨论】:

【解决方案2】:

Ian Kemp 的答案没有问题,但我只是想提供另一个答案,这意味着您不必重新编译代码。

任何高于 .NET 4.5 的版本都可以支持 TLS 1.2,但低于 .NET 4.7 的默认版本是 TLS 1.1。因此,如果您需要使用 TLS 1.2 访问某些内容,则会出现错误,因为它将尝试使用默认值。

您可以将以下代码添加到配置文件中,以覆盖默认值。

<runtime>
      <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/>
</runtime>

更新

对于 .NET Framework 4.7 及更高版本,默认由操作系统选择最佳安全协议和版本。

对于 .NET Framework 4.6 到 4.6.2,AppContext 开关可以放在 app.config 或 webconfig 中,因为系统默认设置为较低的 TLS 或 SSL 版本。

<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/>
</runtime>

对于 .NET Framework 4.5 到 4.5.2,需要设置注册表项 SchUseStrongCrypto 和 SystemDefaultTlsVersions。

HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto

SchUseStrongCrypto 注册表项具有 DWORD 类型的值。值 1 会导致您的应用使用强加密,值 0 会禁用强加密。强加密使用更安全的网络协议(TLS 1.2、TLS 1.1 和 TLS 1.0)并阻止不安全的协议。对于 .NET Framework 4.5.2 或更早版本,键默认为 0。在这种情况下,您应该将其值显式设置为 1。

HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions

SystemDefaultTlsVersions 注册表项具有 DWORD 类型的值。值为 1 会使您的应用程序允许操作系统选择协议。值 0 会导致您的应用使用 .NET Framework 选择的协议。

如果应用程序以 .NET Framework 4.6.1 或更早版本为目标,则键默认为 0。在这种情况下,您应该将其值显式设置为 1。

对于在 32 位操作系统上运行的 32 位应用程序和在 64 位操作系统上运行的 64 位应用程序的示例,请更新以下子项值:

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

对于在 64 位操作系统上运行的 32 位应用程序,请更新以下子项值:

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

【讨论】:

  • 这是否在属性组部分的 .csproj 中?
  • 不,这会放在已编译应用的 app.config 中。
  • 我认为这个答案被低估了。
  • 请注意,这仅在 .NET Framework 4.6+ 中受支持
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 2018-07-24
  • 2017-10-07
  • 2017-08-31
  • 2017-10-06
  • 2017-08-08
  • 2017-12-03
  • 1970-01-01
相关资源
最近更新 更多