.NET Framework 3.5和TLS 1.2

36

我目前有一个使用.NET 3.5框架的Web应用程序,想知道它是否兼容TLS 1.2。在我们的代码中没有指定TLS版本。这是一个遗留应用程序,现在不考虑重新编译。我没有找到太多关于你能否做到这一点的信息,但我印象中兼容性更依赖于操作系统版本。看起来最低要求是2008 R2。目标是在7月1日之前让PayPal正常通信。

5个回答

59

如之前所提到的,.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文件。


2
非常好的解决方案建议,而不是安装 MS 更新并更改注册表。它为我节省了大量时间。 - kumar chandraketu
你需要知道的是,还有一个特定于Server 2012 R2的文章/下载可用(https://support.microsoft.com/en-gb/help/3154520/support-for-tls-system-default-versions-included-in-the-net-framework)。 - freefaller
2
啊,谢谢!我正在使用Dynamics AX 2009。我试图引用一个调用UPS地址验证的DLL。我的原始代码在服务器上可以工作,但在客户端上却不行。你的答案为我解决了这个问题。 - manderson
太棒了!它可以放在global.asax文件中吗? - undefined

21

1
是的,你说得对。我遇到了TLS 1.2的问题,它一直在我脑海中与.NET 4.5联系在一起 :) - orhun.begendi
2
没有什么比继承多年未更新或维护的代码更让人头疼了。感谢你们两位。 - Chris Lombardi
1
因为@Paulina提供了答案而被踩,但是.NET 3.5.1和类SecurityProtocolTypeExtensionsSslProtocolsExtensions有更新,其中包括TLS1.2。 - Janis Veinbergs
2
@JanisVeinbergs 答案是在2017年4月给出的,补丁于2017年5月发布。看起来你有一些非常高的标准。 - Kevin Dahl
2
@KevinDahl 问题在于,人们来到这个网站可能会查看顶部答案以了解真相。这就是为什么我会点踩,试图推动准确的答案上升。但由于op最近编辑了他的答案,在我的评论之后,我撤回了我的点踩,因为现在阅读这个答案的人可以找到准确的信息了。 - Janis Veinbergs
显示剩余5条评论

13

您可以将TLS 1.2与Framework 3.5配合使用。

微软已经发布了相应的更新。

按照以下步骤进行:

  1. 从此处安装Framework 3.5中支持TLS的更新:

https://support.microsoft.com/zh-cn/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7-sp1-and-server-2008-r2-sp1

  1. 打开注册表
    • 在开始菜单中键入regedit
    • 右键单击并选择“以管理员身份运行”
    • 导航到注册表项

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727]

  • 右键单击注册表项,然后选择导出
  • 命名文件,并使用.reg扩展名保存(作为备份以防需要恢复)

    1. 添加注册表项
  • 复制保存的文件,并将它们重命名
  • 使用文本编辑器打开文件,在每个键中添加以下文本(这是针对64位操作系统的,32位操作系统请查看链接中的信息),然后保存更改

[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

  • 双击文件并在窗口上点击“是”以允许更改

    1. 根据链接中的开发人员指南部分,在您的项目中添加代码

我尝试了这个解决方案,对我有效。


你的回答是编辑注册表,使TLS 1.2成为系统默认值。当然,这是一件好事,应该由系统管理员完成。 - D_Bester
3
但这个问题是关于开发网络应用程序的。编辑注册表是完全不必要的。你应该直接在代码中指定TLS 1.2,而不是依赖于注册表中的系统默认值。 - D_Bester
提醒一下,还有一个特定于Server 2012 R2的文章/下载可用。链接:https://support.microsoft.com/en-gb/help/3154520/support-for-tls-system-default-versions-included-in-the-net-framework - freefaller

6

我刚刚验证过,下面这段代码是在.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枚举中获取的:

  • 192:指定TLS 1.0安全协议
  • 768:指定TLS 1.1安全协议
  • 3072:指定TLS 1.2安全协议

我不确定运行此代码的服务器是否必须安装.NET Framework 4.5运行时,但可能会需要。


非常感谢。对我来说效果很好,正如预期的那样。 - Bala

0

1
选择最能描述你问题的标签。更多信息请阅读指南 https://stackoverflow.com/help/tagging - Mannan Bahelim

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