.NET Framework 4.0 中的 TLS 1.2

TLS 1.2 in .NET Framework 4.0

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

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

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

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

你应该包括 system.net class

我在调用 Web 服务之前这样做了,因为我们也必须阻止 tls1。

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

如果您无法将 属性 添加到 system.net class 库。

然后,在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。

在您的注册表中进行以下更改,它应该会起作用:

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

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

我在 VB 中编写代码,并且能够将以下行添加到 Application_Start

中的 Global.asax.vb 文件中
ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)    'TLS 1.2

有两种可能的情况,

  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>