.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: SchUseStrongCryptoDWORD 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.