.NET 4.5 和 .NET 4.5.1 是否默认启用 TLS 1.1 和 TLS 1.2?
Is TLS 1.1 and TLS 1.2 enabled by default for .NET 4.5 and .NET 4.5.1?
在我们的 Windows 2012 Server R2 上,我们需要禁用 TLS 1.0。
但是我们有 .NET 4.5 Wcf 服务 运行ning。我们发现,如果我们禁用 TLS 1.0,WCF 服务将不再 运行,因为我们会收到错误 'An existing connection was forcibly closed by the remote host'。
.NET 4.5 和 .NET 4.5.1 是否默认启用 TLS 1.1/1.2?如果不是,我们假设是这种情况,在我们的 WCF 项目中,我们强制项目使用 TLS 1.1/1.2 吗?
Is TLS 1.1/1.2 enabled by default in .NET 4.5 and .NET 4.5.1?
没有。为各种框架版本启用的默认协议是:
- .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
虽然 Microsoft recommends against explicitly specifying protocol versions 赞成使用操作系统的默认值:
To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. .NET Framework applications should use the TLS version the operating system (OS) supports.
...通过使用 ServicePointManager
class, specifically by setting the SecurityProtocol
property to the relevant SecurityProtocolType
仍然可以 select 您的应用程序支持哪些协议。
在您的情况下,您可能希望使用以下内容:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
请注意,自 2020 年起,TLSv1 和 TLSv1.1 已被有效弃用;您应该避免构建依赖这些协议的新应用程序,并尽一切努力升级当前使用它们的应用程序。
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 及更高版本,默认为 OS 选择最佳安全协议和版本。
对于 .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 位 OS 上的 32 位应用程序示例和在 64 位 OS 上 运行 的 64 位应用程序示例s,更新以下子键值:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001
对于在 64 位 OS 上 运行 的 32 位应用程序,更新以下子项值:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001
我也在寻找这个答案,因为我们有一个 ASP.NET MVC 4.5.x 应用 运行 正在生产中。
我认为官方 Microsoft 文档中对此有更新的答案。
有关完整详细信息,请参阅以下内容:
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
看来您只需要更新注册表中的值即可。
他们建议您不要更改代码来处理差异。
只有 如果您是 运行 .NET Framework 3.5,您是否需要显式设置标志值。
在我们的 Windows 2012 Server R2 上,我们需要禁用 TLS 1.0。
但是我们有 .NET 4.5 Wcf 服务 运行ning。我们发现,如果我们禁用 TLS 1.0,WCF 服务将不再 运行,因为我们会收到错误 'An existing connection was forcibly closed by the remote host'。
.NET 4.5 和 .NET 4.5.1 是否默认启用 TLS 1.1/1.2?如果不是,我们假设是这种情况,在我们的 WCF 项目中,我们强制项目使用 TLS 1.1/1.2 吗?
Is TLS 1.1/1.2 enabled by default in .NET 4.5 and .NET 4.5.1?
没有。为各种框架版本启用的默认协议是:
- .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
虽然 Microsoft recommends against explicitly specifying protocol versions 赞成使用操作系统的默认值:
To ensure .NET Framework applications remain secure, the TLS version should not be hardcoded. .NET Framework applications should use the TLS version the operating system (OS) supports.
...通过使用 ServicePointManager
class, specifically by setting the SecurityProtocol
property to the relevant SecurityProtocolType
仍然可以 select 您的应用程序支持哪些协议。
在您的情况下,您可能希望使用以下内容:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
请注意,自 2020 年起,TLSv1 和 TLSv1.1 已被有效弃用;您应该避免构建依赖这些协议的新应用程序,并尽一切努力升级当前使用它们的应用程序。
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 及更高版本,默认为 OS 选择最佳安全协议和版本。
对于 .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 位 OS 上的 32 位应用程序示例和在 64 位 OS 上 运行 的 64 位应用程序示例s,更新以下子键值:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001
对于在 64 位 OS 上 运行 的 32 位应用程序,更新以下子项值:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001
我也在寻找这个答案,因为我们有一个 ASP.NET MVC 4.5.x 应用 运行 正在生产中。
我认为官方 Microsoft 文档中对此有更新的答案。
有关完整详细信息,请参阅以下内容: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
看来您只需要更新注册表中的值即可。
他们建议您不要更改代码来处理差异。
只有 如果您是 运行 .NET Framework 3.5,您是否需要显式设置标志值。