[英]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.