我目前有一个使用.NET 3.5框架的Web应用程序,想知道它是否兼容TLS 1.2。在我们的代码中没有指定TLS版本。这是一个遗留应用程序,现在不考虑重新编译。我没有找到太多关于你能否做到这一点的信息,但我印象中兼容性更依赖于操作系统版本。看起来最低要求是2008 R2。目标是在7月1日之前让PayPal正常通信。
如之前所提到的,.NET 3.5.1现在支持TLS 1.2;但您不需要@Paulina回答中提到的注册表更改。
我正在使用带有.NET 3.5.30729.4926的VS 2008。我所要做的就是:
添加导入:
Imports System.Security.Authentication
Imports System.Net
将以下代码添加到我的C#代码中:
public const SslProtocols _Tls12 = (SslProtocols)0x00000C00;
public const SecurityProtocolType Tls12 = (SecurityProtocolType)_Tls12;
ServicePointManager.SecurityProtocol = Tls12
VB.net版本:
Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12
摘自:https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework 注意:通过在我的代码中定义常量,我可以忽略文章中的其他内容,包括注册表编辑和cs文件。
如您从文档中看到的那样,TLS 1.2未在SslProtocols
枚举中列出。它是在.NET 4.5中添加到枚举中的(感谢@orhun)。
.NET 3.5上没有解决TLS 1.2兼容性的方法。
不幸的是,您将不得不升级到.NET 4.5或更高版本才能获得TLS 1.2兼容性。
编辑于10/11/17
我的上述答案已不再准确。在2017年5月,微软发布了一个包,在.NET 3.5.1中允许使用TLS 1.2。
SecurityProtocolTypeExtensions
、SslProtocolsExtensions
有更新,其中包括TLS1.2。 - Janis Veinbergs您可以将TLS 1.2与Framework 3.5配合使用。
微软已经发布了相应的更新。
按照以下步骤进行:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727]
命名文件,并使用.reg扩展名保存(作为备份以防需要恢复)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727] "SystemDefaultTlsVersions"=dword:00000001
双击文件并在窗口上点击“是”以允许更改
我尝试了这个解决方案,对我有效。
我刚刚验证过,下面这段代码是在.NET Framework 3.5中启用TLS 1.2支持的全部必需内容:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
我通过在.NET Framework 3.5中创建一个单元测试来验证了这个HTML页面:https://clienttest.ssllabs.com:8443/ssltest/viewMyClient.html
如果没有上述行,TLS测试页面会显示我正在使用TLS 1.0, 这是.NET 3.5的默认值。
TLS 1.1已经和1.0一起被弃用,但如果你想启用它,你可以使用这行代替(不推荐):
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 | (SecurityProtocolType)768;
这里的“神奇值”3072和768是从.NET Framework 4.5 的SecurityProtocolType
枚举中获取的:
我不确定运行此代码的服务器是否必须安装.NET Framework 4.5运行时,但可能会需要。
我遇到了与OP相同的问题 - 旧的.NET 3.5代码需要使用TLS 1.2连接到外部服务。
如已接受的答案所述,微软发布了一个TLS 1.2的补丁。
此后,他们为Server 2008(非R2)发布了一个补丁: https://cloudblogs.microsoft.com/microsoftsecure/2017/07/20/tls-1-2-support-added-to-windows-server-2008/
因此,在仍在运行Server 2008的情况下升级到TLS 1.2应该是可能的。