.NET Framework 4.0中的TLS 1.2


74

我有一台运行十几个.NET Framework 4.0 WebForms应用程序的Windows Server 2008 R2服务器,我需要禁用TLS 1.0和更低版本。当我这样做时,所有安全连接都将失败,因此我不得不重新启用TLS 1.0。有什么方法可以在Framework 4.0环境中使用TLS 1.2?也许我缺少什么?

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

Answers:


40

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

在您设置的应用一开始

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

你应该包括system.net课程

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


30
对于SecurityProtocolType没有.NET 4.0的项目,这不起作用Tls12。
— 马丁”

56
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072; 尽管它可能需要对运行时进行完全修补/更新,但这将在4.0中起作用。
— STW

8
今年一岁,在我看来,答案是错误的!它应该使用@STW提供的答案进行更新
— RoLYroLLs

13
如果您使用的是.NET 4.0
— 则可

4
不要对安全协议进行硬编码。请参阅.NET的TLS最佳做法
— user24601 '18

88

如果您无法将属性添加到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。

注册表


5
我认为这需要安装.net 4.5,因此从技术上讲,这不是.net 4.0的修复程序。
— NickG

2
它需要安装.NET 4.5才能进行编译,但是您不必在项目中定位它。
— 马丁

3
任何人的未来确认:这适用于VB .NET 3.5。 ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType) 'TLS 1.2
— petrosmm

1
@Martin,但您确实需要在目标计算机上安装.NET 4.5才能起作用。
— NickG '17

4
随附的屏幕快照不能证明没有安装4.5+框架。他们在V4 /全键显示为“释放”的文章:docs.microsoft.com/en-us/dotnet/framework/migration-guide/...
— pushist1y

70

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

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

6
这完美地工作了,不需要我添加其他帖子正在谈论的代码行。
— 巴克斯特

5
太棒了,它设法使.Net40与TLS 1.2 Payment网关和邮件服务器进行通信。重新启动WWW发布服务足以使其正常工作。
— ExternalUse

4
我需要所有这些键/值,还需要重新启动服务器,但是之后,.Net 4.0应用程序中支持TLS 1.2,而无需进行任何代码更改。
— cori

3
我希望我不需要5个小时就能找到这篇文章。这解决了我的SSL握手错误(请求已中止:无法创建SSL / TLS安全通道)。
— birken25年

3
谢谢!!!这通过MarkdownPad使用github的markdown渲染服务解决了我的问题。
— 修订

26

根据这个,你需要安装.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

3
为了获得不更改代码的TLS 1.2,除了注册表项之外,您还需要安装.NET 4.6。更多信息,请访问:github.com/TheLevelUp/pos-tls-patcher
— user24601 '18

13

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

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

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>

0

我在Windows安装的.NET Framework 4.0上遇到相同的问题。
我通过安装.NET Framework 4.6.2解决了此问题。
或者,您可以下载最新的软件包以进行尝试。


如果他们需要运行4.5,该怎么办?
— TS

我已经安装了它,它不起作用。实际上,注册密钥可以完成这项工作。
— Uwe Allner '19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.