簡體   English   中英

在 HttpClient C# 中支持 TLS 1.2

[英]supporting TLS 1.2 in HttpClient C#

下午好! 我使用 HttpClient 使用 Azure Maps API。 如何啟用對 TLS 1.2 的支持? 據我所知,在 Framework 4.6+ 中它是受支持的。 我不應該為此做任何事情嗎?

使用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)從操作系統或系統管理員執行的任何自定義配置繼承默認安全協議。

通常,無需在應用程序中指定任何配置即可采用最新的 TLS 協議。

docs.microsoft.com上概述了 .Net 4.7 之前的最佳實踐和方案。

在高層次上,您應該進行審核以確保您的應用程序不會對較低的 TLS 版本產生任何硬依賴。 但除此之外,不需要任何工作。

我們建議您:

  • 在您的應用上以 .NET Framework 4.7 或更高版本為目標。 在 WCF 應用程序上定位 .NET Framework 4.7.1 或更高版本。
  • 不要指定 TLS 版本。 配置您的代碼,讓操作系統決定 TLS 版本。
  • 執行徹底的代碼審計以驗證您沒有指定 TLS 或 SSL 版本。

當您的應用讓操作系統選擇 TLS 版本時:

  • 它會自動利用未來添加的新協議,例如 TLS 1.3。
  • 操作系統會阻止被發現不安全的協議。

值得探索有關TLS 最佳實踐的Microsoft 文檔

對我來說,問題是通過添加以下注冊表項之一解決的:

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

此處提供Microsoft 官方答案

它看起來像這樣:

private static void Main(string[] args)
{
   var httpClient = new HttpClient(new HttpClientHandler() { AllowAutoRedirect = false, SslProtocols = System.Security.Authentication.SslProtocols.Tls12 });

   ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

   var response = httpClient.GetAsync("http//myurl.com").GetAwaiter().GetResult();

 }

但不適用於我們所有的項目(包括 != 4.7.1 框架項目),如果有,請添加信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM