.NET Framework 4.0 中的 TLS 1.2

问题描述 投票:0回答:8

我有一台运行十几个 .NET Framework 4.0 WebForms 应用程序的 Windows Server 2008 R2 服务器,我需要禁用 TLS 1.0 及更低版本。当我这样做时,所有安全连接都会失败,我被迫重新启用 TLS 1.0。有没有办法在framework 4.0环境中使用TLS 1.2?也许我错过了什么?

此外,由于我们使用的CMS版本的限制,我们目前无法升级框架。

asp.net .net-4.0 windows-server-2008-r2 tls1.2
8个回答
108
投票

如果您无法将属性添加到

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。

registry


89
投票

在注册表中进行以下更改,它应该可以工作:

1.) .NET Framework 强加密 注册表项

[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.) 安全通道 (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

47
投票

我发现改变这一点的唯一方法是直接在代码上:

在您的应用程序一开始设置

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

您应该包括

system.net
课程

我在调用 Web 服务之前执行了此操作,因为我们也必须阻止 tls1。


33
投票

根据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

17
投票

有两种可能的情况

  1. 如果您的应用程序在 .net Framework 4.5 或更低版本上运行,并且您可以轻松地将新代码部署到生产中,那么您可以使用以下解决方案。

    您可以在调用 API 之前添加以下代码行,

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // .NET 4.0
    
  2. 如果您无法部署新代码,并且希望使用生产中存在的相同代码解决问题,那么您有两种选择。

选项 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>

14
投票

我使用 VB 进行编码,并且能够将以下行添加到 Application_Start 内的 Global.asax.vb 文件中

ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)    'TLS 1.2

0
投票

我在 Windows 安装的 .NET Framework 4.0 上遇到了同样的问题。
我通过安装 .NET Framework 4.6.2解决了这个问题。
或者您可以下载最新包来尝试一下。


0
投票

这对我有用。

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
© www.soinside.com 2019 - 2024. All rights reserved.