在C#的HttpClient中支持TLS 1.2

13

下午好! 我使用HttpClient使用Azure Maps API。 如何启用TLS 1.2支持? 据我所知,在框架4.6+中支持它。我不需要做任何事情让它工作吗?


TLS 1.2已经可以使用了,您不需要做任何事情。为什么会有这个问题?您使用的是哪个框架(旧版/核心,版本号)和操作系统版本? - Panagiotis Kanavos
你是否在运行不受支持的操作系统版本,例如Windows Server 2008R2或Windows Vista?您可能需要应用一些操作系统补丁以启用TLS1.2。 - Panagiotis Kanavos
你有实际的问题吗?有实际的问题吗?您是否正在询问如何验证是否使用了TLS1.2?或者确实,如何限制仅使用TLS1.2进行连接?这是您不应该做的事情,因为当TLS1.3添加时,您将不得不重新部署应用程序。 - Panagiotis Kanavos
4个回答

19

使用ServicePointManager来设置安全协议。

获取或设置由ServicePointManager对象管理的ServicePoint对象使用的安全协议。

HttpClient httpClient = new HttpClient();   

//specify to use TLS 1.2 as default connection
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

此属性选择用于新连接的安全套接字层 (SSL) 或传输层安全性 (TLS) 协议的版本;现有连接不会更改。

.NET Framework 4.7 开始,该属性的默认值为 SecurityProtocolType.SystemDefault。这允许基于 SslStream 的 .NET Framework 网络 API(如 FTP、HTTP 和 SMTP)从操作系统继承默认安全协议,或从系统管理员执行的任何自定义配置中继承默认协议。


3
在.NET Framework 4.6+和支持的操作系统版本中,您无需这样做。它并不会“启用”TLS1.2,而是“防止”使用更低版本的TLS。在4.6之前,协商从TLS1.1向下开始,需要使用该开关来强制使用TLS1.2。 - Panagiotis Kanavos
我听说Azure Maps将于2020年2月1日停止支持TLS 1.0和1.1,我想知道在我的情况下是否需要采取什么措施。据我所知 - 如果我使用.Net Framework 4.6.1,则不需要做任何事情。 - Dmytro
是的,默認值是最高支持的,所以基本上你不需要做任何事情,就像@PanagiotisKanavos所說的那樣。 - Athanasios Kataras
1
我看到所有这些评论都说这不是必需的,但这正是我需要做的,以使帖子能够在Okta上工作。我们正在使用.Net Framework 4.8,现在是2021年5月。也许这取决于Okta服务器,我不知道,但在我的情况下,这解决了我遇到的确切问题。 - BlueD
我遇到的错误是:“现有连接被远程主机强制关闭”。 - BlueD
显示剩余3条评论

9

一般来说,在您的应用程序中无需指定任何配置即可启用最新的TLS协议。

早期版本的最佳实践和场景在learn.microsoft.com中概述

在高层次上,您应该进行审计,以确保您的应用程序不会对较低的TLS版本有任何硬依赖。但是除此之外,不需要任何工作。

我们建议您:

  • 在应用程序中目标.NET Framework 4.7或更高版本。在WCF应用程序中目标.NET Framework 4.7.1或更高版本。
  • 不要指定TLS版本。将代码配置为让操作系统决定TLS版本。
  • 执行彻底的代码审计以验证您未指定TLS或SSL版本。

当您的应用程序允许操作系统选择TLS版本时:

  • 它自动利用未来添加的新协议,例如TLS 1.3。
  • 操作系统阻止发现不安全的协议。

我该如何指定至少要使用哪个证书?我需要一个由特定CA颁发的证书以启用双向TLS。 - justin.m.chase

1

值得探索Microsoft文档中关于 TLS最佳实践的内容。

对我来说,问题是通过添加以下注册表键之一解决的:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001

你使用了哪个框架版本? - Gray Programmerz

0

必须说两件事情是真的:

1.) .NET 4.7.2 中的 HTTP 客户端读取 SystemDefaultTLSVersions,而 4.6 没有。如果没有此项,则 4.7.2 只会否定到 SSL 3.0,然后停止。这是一个根本性的改变,使用该 HTTP 客户端的应用程序最好通过产品设置单独添加注册表值。

2.) 操作系统默认不阻止任何内容。管理员必须禁用较低级别的加密,不应使用它们。而这在 schannel 注册表键下面技术上发生。

只是举个例子...强制使用 TLS 1.1,您必须像这样禁用 TLS 1.0、SSL 3.0、SSL 2.0 和 PCI 2.0

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client] "DisabledByDefault"=dword:00000001 "Enabled"=dword:00000000

TLS 1.1 将具有 Disabledbydefault=0 和 Enabled=1,在 Server 2022 中还有一个针对 TLS 1.3 的选项。


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