.NET Framework 4.0中的TLS 1.2

bet*_*reg 62 asp.net .net-4.0 windows-server-2008-r2 tls1.2

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

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

Vik*_*ant 80

如果您无法向system.net类库添加属性.

然后,添加Global.asax文件:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768; //TLS 1.1
Run Code Online (Sandbox Code Playgroud)

你可以在一个函数中使用它,在起始行:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
Run Code Online (Sandbox Code Playgroud)

并且,它对STRIPE支持网关非常有用,支持网关仅支持TLS 1.1,TLS 1.2.

编辑: 在我的服务器上安装了很多关于.NET 4.5的问题之后......这是Registry我生产服务器上的屏幕截图:

我只安装了.NET framework 4.0.

注册处

  • 我认为这需要安装.net 4.5,所以从技术上讲这不是.net 4.0的修复. (4认同)
  • 任何人的未来确认:这适用于VB .NET 3.5.`ServicePointManager.SecurityProtocol = DirectCast(3072,SecurityProtocolType)'TLS 1.2` (3认同)
  • 它需要安装.NET 4.5才能进行编译,但是您不必在项目中定位它。 (2认同)
  • @Martin,但您确实需要在目标计算机上安装 .NET 4.5 才能正常工作。 (2认同)
  • @petersmm感谢那个剧本,它对我帮助很大! (2认同)
  • 随附的屏幕快照无法证明没有安装4.5+框架。它们显示在v4 / Full键下并带有“ Release”关键字:https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed (2认同)

Adi*_*dge 57

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

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这工作得很好,不需要我添加其他帖子正在谈论的代码行。 (6认同)
  • 太棒了,这设法让.Net40与TLS 1.2支付网关和邮件服务器通信.重新启动WWW Publishing服务足以使其工作. (5认同)
  • 我需要所有这些键/值,并且还需要重新启动服务器,但之后在.Net 4.0应用程序中支持TLS 1.2而没有任何代码更改. (4认同)
  • 我希望我花了5个小时才找到这篇文章。这解决了我的SSL握手错误(请求已中止:无法创建SSL / TLS安全通道)。 (3认同)
  • 谢谢!!!这通过MarkdownPad使用github的降价渲染服务解决了我的问题. (2认同)
  • 为我工作的Windows Server 2012 R2 .NET 4.0,重新启动IIS,不重新启动 (2认同)

小智 35

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

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

你应该包括这个system.net班级

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

  • `ServicePointManager.SecurityProtocol =(SecurityProtocolType)3072;`这将在4.0中运行,尽管它可能需要对运行时进行完全修补/更新. (45认同)
  • 这不适用于面向.NET 4.0的项目,因为`SecurityProtocolType`没有成员`Tls12`. (25认同)
  • 如果您使用的是.NET 4.0,则接受的答案是错误的 (10认同)
  • 虽然这已经有一年了,但在我看来,答案是错误的!应该使用@STW提供的答案进行更新 (8认同)
  • 不要硬编码安全协议.请参阅[TLS最佳实践与.NET](https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls) (4认同)
  • 问题是关于.NET 4.0,这个代码不能在.NET 4.0中编译. (2认同)

Bra*_*exe 25

根据这个,你需要.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: SchUseStrongCryptoDWORD 1

  • 为了在不更改代码的情况下获得 TLS 1.2,除了注册表项之外,您还需要安装 .NET 4.6。更多信息在这里:https://github.com/TheLevelUp/pos-tls-patcher (4认同)

use*_*607 6

我在VB中编写代码,并能够将以下行添加到Application_Start内的Global.asax.vb文件中

ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)    'TLS 1.2
Run Code Online (Sandbox Code Playgroud)


sag*_*ole 6

有两种可能的情况,

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

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

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // .NET 4.5
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // .NET 4.0
    
    Run Code Online (Sandbox Code Playgroud)
  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


Run Code Online (Sandbox Code Playgroud)

然后创建一个带有扩展名的文件.reg并安装。

注意:此设置将应用于注册表级别,适用于该计算机上存在的所有应用程序,如果您只想限制为单个应用程序,则可以使用Option 2

选项 2:这可以通过更改配置文件中的一些配置设置来完成。您可以在配置文件中添加。

<runtime>
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/>
</runtime>
Run Code Online (Sandbox Code Playgroud)

或者

<runtime>
  <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"
</runtime>
Run Code Online (Sandbox Code Playgroud)