我有一个运行十几个 .NET Framework 4.0 WebForms 应用程序的 Windows Server 2008 R2 服务器,我需要禁用 TLS 1.0 及更低版本。当我这样做时,所有安全连接都会失败,我被迫重新启用 TLS 1.0。有没有办法在框架 4.0 环境中使用 TLS 1.2?也许我错过了什么?
此外,由于我们使用的 CMS 版本的限制,我们目前无法升级框架。
如果您无法将属性添加到 system.net
类库。
然后,添加 Global.asax 文件:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768; //TLS 1.1
您可以在函数中使用它,在起始行:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
而且,它对 STRIPE
支付网关很有用,它只支持 TLS 1.1、TLS 1.2。
编辑: 在我的服务器上安装了这么多关于 .NET 4.5 的问题之后......这是我的生产服务器上 Registry
的屏幕截图:
我只安装了 .NET Framework 4.0。
https://i.stack.imgur.com/FlGhA.png
在您的注册表中进行以下更改,它应该可以工作:
1.) .NET Framework strong cryptography 注册表项
[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
2.) Secure Channel (Schannel) TLS 1.2 注册表项
[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
我发现改变它的唯一方法是直接在代码上:
在您设置的应用程序的开头
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
您应该包括 system.net
类
我在调用 Web 服务之前这样做了,因为我们也必须阻止 tls1。
SecurityProtocolType
没有成员 Tls12
。
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072;
这将在 4.0 中有效,但可能需要完全修补/更新您的运行时。
根据 this,您需要安装 .NET 4.5。更多详情,请访问网页。它的要点是,在您安装了 .NET 4.5 之后,您的 4.0 应用程序将使用 4.5 System.dll。您可以通过两种方式启用 TLS 1.2:
在应用程序的开头,添加这段代码:ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
将注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319: SchUseStrongCrypto 设置为 DWORD 1
我在 VB 中编写代码,并且能够将以下行添加到 Application_Start 内的 Global.asax.vb 文件中
ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType) 'TLS 1.2
有两种可能的情况,
如果您的应用程序在 .net framework 4.5 或更低版本上运行,并且您可以轻松地将新代码部署到生产环境中,那么您可以使用以下解决方案。您可以在调用 API 之前添加以下代码行,ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // .NET 4.0 如果您无法部署新代码并且想使用生产中存在的相同代码解决问题,那么您有两个选择。
选项1 :
[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
然后创建一个扩展名为 .reg
的文件并安装。
注意:此设置将在注册表级别应用,并适用于该计算机上存在的所有应用程序,如果您想限制为仅单个应用程序,则可以使用 Option 2
选项 2:这可以通过更改配置文件中的一些配置设置来完成。您可以在配置文件中添加任何一个。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
</runtime>
或者
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"
</runtime>
我在安装了 .NET Framework 4.0 的 Windows 上遇到了同样的问题。
我通过安装 .NET Framework 4.6.2 解决了这个问题。
或者您可以下载 newest package 进行尝试。
ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType) 'TLS 1.2