簡體   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