繁体   English   中英

.NET v4.7 不存在 TLS1.2

[英]TLS1.2 does not exist with .NET v4.7

我收到一个未处理的异常, The request was aborted: could not create SSL/TLS secure channel因此我尝试使用 Tls1.2,希望它能解决此问题。

我读到 .NET 4.6 及更高版本的默认值是 TLS1.2

我有 4.7 版,有一行ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 在我的代码中,但 .Tls12 下有一个红色的.Tls12 Visual Studio 表示SecurityProtocolTypes does not contain a definition for Tls12并建议我将.Tls12替换为.Tls

如何在我的代码中使用 Tls1.2?

我应该补充一点,我也试过: ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0|0x300 0xc00);

您是否已阅读.NET Framework的传输层安全性(TLS)最佳做法

它说:

为确保.NET Framework应用程序保持安全, 应对TLS版本进行硬编码。

.NET Framework应用程序应使用操作系统(OS)支持的TLS版本。

然后:

如果您的应用程序针对.NET Framework 4.7或更高版本

以下各节说明如何验证您未使用特定的TLS或SSL版本。

对于HTTP网络

使用.NET Framework 4.7和更高版本的ServicePointManager,默认情况下是操作系统选择最佳的安全协议和版本。 为了获得默认操作系统的最佳选择,请不要为SecurityProtocol属性设置值。 否则,将其设置为SystemDefault。

因此,如果默认情况下它不起作用...也许您不是真的使用4.7吗?

还是您的操作系统太旧了,不支持它?

还是目标不支持它?

无论哪种方式,都无需将其显式设置为1.2

@nvoigt 正确回答了这个问题,但我想我会分享我最近的经验,看到它非常相似,但有一点不同。

背景故事:我有一个针对 .net 3.5 开发的应用程序,它是使用 Visual Studio 2013 更新 1 构建的。这是为了与另一个应用程序兼容。 在该应用程序中,它使用了一个更新为使用 TLS 1.2 的端点。 因为 .net 3.5 不支持 TLS 1.2,我们不得不解决这个问题。

根据@nvoigt 发布的答案(以及与此相关的网络的其余部分),我明白升级应用程序以针对较新的 .net 框架(在我的情况下为 4.7.1)将解决问题,只要我们不是在我们的应用程序中硬编码任何这些协议。 这将允许操作系统指示协议。

问题:使用 Visual Studio 2013,更新 1 - 我将我们应用程序的目标框架更新到 .net 4.7.1 并验证ServicePointManager.SecurityProtocol没有在任何地方进行硬编码,因此它会服从操作系统。 这不起作用,无论我在网上阅读了多少文章都说它会起作用

解决方案:使用 Visual Studio 2019 - 我打开并测试了仍然针对 .net 4.7.1 的完全相同的应用程序,除了用于编译项目的 Visual Studio 版本之外没有其他任何更改。 这确实有效!

我的发现:我想消除我的特定项目中可能导致此问题的其他原因的任何可能性。 为此,我创建了一个全新的windows 窗体项目,并在Program类的static void Main()方法中设置了以下变量var x = ServicePointManager.SecurityProtocol; 查看默认设置的值。 这是我对新项目所做的唯一修改。 然后,我继续在 Visual Studio 2013 和 Visual Studio 2019(均针对 .net 4.7.1)中调试完全相同的新项目,结果如下所示:

Visual Studio 2013 -(针对 .net 4.7.1)

var x = ServicePointManager.SecurityProtocol;
//  ^ x defaults to 'Ssl3 | Tls'

Visual Studio 2019 -(针对 .net 4.7.1)

var x = ServicePointManager.SecurityProtocol;
//  ^ x defaults to 'SystemDefault'

请参阅下面的并排屏幕截图(左侧为 VS 2013,右侧为 VS 2019): 在此处输入图片说明

即使我手动设置ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault; 在 Visual Studio 2013 中它就行不通了! 使其在 Visual Studio 2013 中工作的唯一方法是对协议进行硬编码,如ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 我们都知道这不是最佳实践。

经验教训:当您知道应该执行其他操作时似乎没有其他工作,请通过使用较新版本的 Visual Studio 编译您的应用程序进行测试,或确保您使用的版本应用了最新更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM