.Net Framework 4.6.1不默认为TLS 1.2

Har*_*yer 41 .net ssl tls1.2 .net-4.6.1

我们的客户最近将安全协议升级到TLS 1.2.因此,我们将应用程序升级到4.6.1,期望安全协议将默认为TLS 1.2,但事实并非如此.知道为什么吗?

小智 44

我遇到了类似的问题,这对我有用.

  1. 打开Powershell并使用检查支持的协议 [Net.ServicePointManager]::SecurityProtocol

  2. 运行以下2个cmdlet以设置.NET Framework强加密注册表项:

    在64位.Net Framework(版本4及更高版本)上设置强加密

    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

    在32位.Net Framework(版本4及更高版本)上设置强加密

    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

  3. 重新启动Powershell并使用,再次检查支持的协议 [Net.ServicePointManager]::SecurityProtocol

它现在Tls12也应该显示出来.

希望这可以帮助

  • 请注意,对我来说,安装了 .NET 4.7.2 后,“SecurityProtocol”在执行这两个命令之前和之后都返回“SystemDefault”。然而,这仍然有效! (3认同)
  • 为我工作 - 谢谢!顺便说一下,如果有时间,请在Microsoft和.NetFramework之间为其他人添加一个反斜杠:"Set-ItemProperty -Path'HKLM:\ SOFTWARE\Microsoft\.NetFramework\v4.0.30319'-Name'SchUseStrongCrypto'-Value'1' -Type DWord"..两个命令也是一样的.或许可以注意到这种效果.再次感谢. (2认同)

use*_*601 21

正如其他人所提到的,必须设置许多Windows注册表项,以便在现有.NET应用程序中启用TLS 1.2,而无需在应用程序代码中明确设置协议版本.

为了使.NET 4.x代码默认选择最强的可用协议(即,在代码中未明确指定协议时),需要以下注册表项:

在32位和64位版本的Windows上: HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto: 0X00000001

在64位版本的Windows上: HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto: 0X00000001

所述WOW6432Node需要值时在64位的系统上运行,以使TLS 1.2在32位应用程序.

但这是快速简便的解决方案:https: //github.com/TheLevelUp/pos-tls-patcher

更新:

如果您的目标是.NET 4.6或4.7,那么您将对.NET Framework的传输层安全性(TLS)最佳实践感兴趣.

请注意,上面链接的TLS Patcher非常遵循Microsoft对现有.NET 4.0和4.5应用程序的建议,这些应用程序无法以.NET 4.6或更高版本为目标.

  • 我认为这应该是公认的答案.我们遇到了同样的问题并观察到以下情况:正常的.Net EXE按预期工作.如果进行了注册表设置,则在本机进程(例如IIS,Office Addin)中托管的程序集仅使用TLS 1.2. (4认同)

Gab*_*abe 18

安全协议未默认为TLS 1.2的原因是因为.NET Framework 4.6.1中没有此默认值.对不起,如果这是重复已经说过的内容,但我想详细说明,我没有足够的声誉来发表评论.

4.6.2中也没有默认值,但是像上面提到的一个评论者一样,控制台应用程序似乎默认为TLS 1.2.我在针对4.6.2的网站项目中尝试了完全相同的代码,并且它没有默认为TLS 1.2.

4.7及更高版本的默认值为SecurityProtocolType.SystemDefault.

"这允许基于SslStream的.NET Framework网络API(例如FTP,HTTP和SMTP)从操作系统或系统管理员执行的任何自定义配置继承默认安全协议"

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.securityprotocol?view=netframework-4.7#System_Net_ServicePointManager_SecurityProtocol


Tob*_*ger 7

我们在 IIS 中托管 .NET 4.6.2 应用程序时遇到了类似的问题。

我们可以通过将httpRuntime元素添加到 web.config来解决这个问题。没有它,我们的服务不会默认使用 TLS 1.2。

<httpRuntime targetFramework="4.6.2" />
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.httpruntimesection?view=netframework-4.7.2


Cam*_* G. 5

MSDN:ServicePointManager.SecurityProtocol属性

此属性选择安全套接字层(SSL)或传输层安全性(TLS)协议的版本,以用于仅使用安全超文本传输​​协议(HTTPS)方案的新连接; 现有连接不会更改.请注意,此属性没有列出默认值.

安全格局不断变化,默认协议和保护级别会随着时间的推移而发生变化,以避免已知的弱点.默认值将根据各个计算机配置,安装的软件以及已应用的修补程序而有所不同.

取自这里

  • *答案*不相关。如果附有参考文献,也许可以发表评论。4.6.2 中 TLS1.2 默认启用 (2认同)
  • @PanagiotisKanavos 我更新了引用的 MSDN 段落 (2认同)

Mic*_* T. 5

我也遇到了这个问题。当本地应用程序尝试连接到支持 TLS 1.1 和 TLS 1.2 的服务器时,它曾经获得“远程主机强制关闭现有连接”异常,或者当 TLS 1.1/1.2 未正确启用时,它曾经获得“Win32Exception:客户端和服务器无法通信,因为它们没有共同的算法”

下面是 x64 Windows 操作系统所需的所有注册表项和值。如果您有 32 位操作系统 (x86),只需删除最后 2 行。TLS 1.0 将被注册表脚本禁用。需要重新启动操作系统。

Windows Registry Editor Version 5.00

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

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ssl 3.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\client]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.0\server]
"disabledbydefault"=dword:00000001
"enabled"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\client]
"disabledbydefault"=dword:00000000
"enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\tls 1.1\server]
"disabledbydefault"=dword:00000000
"enabled"=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

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
Run Code Online (Sandbox Code Playgroud)


小智 5

基于以下链接

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls

我已经添加

AppContext.SetSwitch("Switch.System.Net.DontEnableSystemDefaultTlsVersions", false);
Run Code Online (Sandbox Code Playgroud)

到我的代码,这为我解决了这个问题。这意味着默认为操作系统支持的最高级别,这与默认情况下从 4.7 及更高版本获得的行为相同。