是否有.NET实现TLS 1.2的方法?

78

由于我刚刚发现RFC 5425要求使用TLS 1.2,并且.NET尚未支持它,因此我想知道是否有任何实现TLS 1.2协议的开源库,如RFC 5246所定义。


对于 .net 3.5,需要添加标志以强制使用 TLS 1.2。https://dev59.com/QVgQ5IYBdhLWcg3wnVR3#44893192 - D_Bester
可能是SSL和已过时的TLS(1.0和1.1)对于.Net 3.5上Web服务客户端应用程序的影响重复问题。投票关闭这个比较老的问题,因为它稍微有点过时了。 - Brian
10个回答

79

是的,尽管您需要在System.Net.ServicePointManager.SecurityProtocol手动启用TLS 1.2。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; // comparable to modern browsers
var response = WebRequest.Create("https://www.howsmyssl.com/").GetResponse();
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();

您的客户端正在使用TLS 1.2,这是加密协议的最新版本。


在默认情况下,WebRequest将使用TLS 1.0或SSL 3

您的客户端正在使用TLS 1.0,这是一个非常老旧的版本,可能容易受到BEAST攻击,并且没有最佳的密码套件可供使用。像AES-GCM和SHA256这样的新增功能无法在TLS 1.0客户端上使用,同样有许多更现代的密码套件也不支持。


10
能否在 app.exe.config 的设置中指定 SecurityProtocol? - Jeffrey LeCours
这不也取决于应用程序运行的操作系统/服务器吗?因为那里才是实际的HTTP流量创建/接收的地方。 - Don Cheadle
谢谢。运行得很好。顺便说一下,这在Windows 2012服务器上可以工作。我被告知Windows 2008不支持TLS1.2。 - LT Dan
您应该能够在2008Svr上使用TLS1.2。可能需要安装dotNet 4.5框架。 请参阅:https://msdn.microsoft.com/zh-cn/library/8z6watww(v=vs.110).aspx - Toby

43

1
实际上,当您使用SSLProtocol常量的值并将其强制转换为枚举时,在.NET 4.0中也可以正常工作。 - Sebastian

28

您可以使用SchUseStrongCrypto注册表设置来要求所有.NET应用程序默认使用TLS 1.2而不是1.0。

Windows Registry Editor Version 5.00

[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

8
微软应该在其安全更新中更新此值。我无法相信默认设置是启用SSL v3并禁用TLS 1.2,而修复方法只需进行简单的注册表设置。 - dana
.Net框架4.0不支持TLS 1.1+,但是框架4.5支持:fwk 4.0: https://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.100).aspxfwk 4.5: https://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx - Negarrak
2
现在(2016年9月)注册表中有许多不同的框架版本(4.0.30319、4.5、4.5.1、4.5.23026、4.5.50709)。哪一个需要更新 - 或者全部都需要更新? - GlennG
1
答案如下 - 您只需要设置4.0.30319即可。 - Jason Steele
1
它将在安装了Microsoft Update KB4019276的Windows 2008 SP2上运行。更多信息请参见此处:https://github.com/TheLevelUp/pos-tls-patcher - user24601

12
我通过切换到最新的 .Net Framework 解决了我的问题。因此,您的目标框架设置了您的安全协议。
当您在 Web.config 中具有以下内容:
<system.web>
  <httpRuntime targetFramework="4.5"/>
</system.web>

默认情况下,您将获得以下内容:

ServicePointManager.SecurityProtocol = Ssl3 | Tls

当你在Web.config中有这个东西时

<system.web>
  <httpRuntime targetFramework="4.6.1"/>
</system.web>

默认情况下,您将得到以下内容:

ServicePointManager.SecurityProtocol = Tls12 | Tls11 | Tls

.NET 4.7.1 是什么? - Kiquenet

9
只需下载此注册表键并运行即可。它将向.NET框架注册表添加必要的键。您可以在此链接中获取更多信息。在“ .NET 4.5到4.5.2”中查找“选项2”。该reg文件将以下内容附加到注册表:
[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

这是页面的有用部分,如果页面发生错误,将会很有用:
要默认启用TLS 1.2,而不修改源代码,请将SchUseStrongCrypto DWORD值设置为1,并在以下两个注册表键中创建它们(如果不存在):“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319”和“HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319”。尽管这些注册表键中的版本号为4.0.30319,但.NET 4.5、4.5.1和4.5.2框架也使用这些值。然而,这些注册表键将在系统上所有已安装的.NET 4.0、4.5、4.5.1和4.5.2应用程序中默认启用TLS 1.2。因此,在部署到生产服务器之前建议先测试此更改。这也可以作为一个注册表导入文件提供。这些注册表值不会影响设置了System.Net.ServicePointManager.SecurityProtocol值的.NET应用程序。

6
你好,我已经编辑了你的回答,将注册表文件的内容包含在内。Reg文件通常被认为是“安全敏感”的,有经验的系统管理员不会盲目地打开他人提供的第一个reg文件(请恕我直言!)。我认为引用链接文章的部分内容也是一个好主意,符合SO政策(不接受纯链接回答-最好是“不完全依赖于链接的回答”) - usr-local-ΕΨΗΕΛΩΝ

8
如果你使用较旧版本的 .NET Framework,那么 TLS 1.2 的支持可在我们的SecureBlackbox产品中的客户端和服务器组件中使用。SecureBlackbox 包含了所有算法的自己实现,因此您使用哪个版本的基于 .NET 的框架并不重要(包括 .NET CF) - 在所有情况下,您都将拥有带有最新补充的 TLS 1.2。
请注意,SecureBlackbox 并不会神奇地将 TLS 1.2 添加到框架类中 - 相反,您需要明确地使用 SecureBlackbox 类和组件。

1
开源项目并不一定意味着您需要公开所有代码。 - Eugene Mayevski 'Callback
1
我想这样做可以满足PCI DSS 3.1的SSL要求,我的想法正确吗?这将非常有用,因为有很多基于XP的操作系统仍在使用,虽然它们仍在得到微软的支持,但无法运行.Net Framework 4.5。 - user1069816
1
@user1069816 在我们仔细分析PCI DSS 3.1的要求之前,我还没有准备好正式确认符合性。但总体而言,SecureBlackbox完全实现了TLS 1.2,并关注最近的安全相关发现,并封装了相应的解决方法。 - Eugene Mayevski 'Callback
1
@user1069816 我们已经审查了PCI DSS 3.1。PCI-DSS 3.1要求所有符合标准的环境在最晚2016年6月30日之前摒弃对SSL(2.0和3.0)和TLS 1.0协议版本的支持。这可以通过SBB轻松实现,SBB提供对TLS 1.1和1.2以及所有现代密码套件的全面支持。 - Eugene Mayevski 'Callback
1
由于SecureBlackbox使用自己的加密和SSL/TLS引擎,因此它不依赖于操作系统或.NET框架提供的相关功能的特定性。也就是说,您可以通过将基于WinAPI或.NET 2.0的软件产品迁移到SecureBlackbox来确保您的旧XP机器保持PCI-DSS合规性。 - Eugene Mayevski 'Callback
显示剩余2条评论

4

最新版本的SSPI(Windows 7捆绑)具有TLS 1.2实现,可以在schannel.dll中找到。


如何在.NET中使用此功能?有什么指导吗? - foson
@foson 这不会很美观,因为SChannel是COM。这里有一个C++示例(http://www.coastrd.com/c-schannel-smtp)和一些非常有用的注释(http://www.coastrd.com/tls-with-schannel)。 - Josh Stodola

3

.NET Framework 4.6 默认使用 TLS 1.2。

此外,只有主机应用程序需要使用 .NET 4.6,引用的库可以继续使用旧版本。


3

您可以按照这些说明在IIS中启用TLS 1.2。如果您有一个基于ASP.NET的应用程序在IIS上运行,我认为这将足够,尽管看起来似乎不完全符合您的需求。


抱歉,这与我无关。我正在编写一个用于运行Syslog协议的应用程序,它与ASP.NET相距甚远,并使用常规套接字编程。不幸的是,我需要一个等同于SslStream的类来为我提供TLS 1.2服务 :( - usr-local-ΕΨΗΕΛΩΝ
1
这个链接现在是403状态,但新的URL似乎是https://www.derekseaman.com/2010/06/enable-tls-12-aes-256-and-sha-256-in.html。 - Martin Costello

-1

此处所述,您只需添加此行即可

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

1
这只适用于.NET 4.0。 - wp78de
不是这样的。枚举根据操作系统而定。除非您使用4.5或更高版本,否则您需要按名称使用枚举。 - bresleveloper
1
不是真的。首先,这取决于.NET Framework的目标版本。如果操作系统支持TLS 1.2,则是第二个问题。 - wp78de

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接