2017-05-09 161 views
11

我們的客戶最近的安全協議升級到TLS 1.2。因此,我們將我們的應用程序升級到4.6.1,期望安全協議將默認爲TLS 1.2,但事實並非如此。任何想法爲什麼?.Net框架4.6.1不默認爲TLS 1.2

+0

你怎麼知道它不是?你嘗試了什麼? –

+0

默認情況下,TLS 1.2在4.6.2中工作 - 使用HttpClient檢索Google.com主頁(TLS1.2)時沒有問題 –

+0

當連接到服務器時出現此錯誤 「這可能是由於服務器在HTTPS情況下,證書使用HTTP.SYS配置不正確。「 但是,在Global.asax文件的啓動方法中添加此行解決了此問題。 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; 但是我們想知道爲什麼我們需要設置這個,如果我們有我們的應用程序在.Net 4.6.1 –

回答

5

MSDN:ServicePointManager.SecurityProtocol物業

此屬性選擇安全套接字層(SSL)或 傳輸層安全(TLS)協議的版本,以用於使用安全超文本傳輸​​新的連接 僅限協議(HTTPS)方案; 現有連接未更改。 請注意,此屬性沒有默認值爲 。

安全格局不斷變化,默認協議和 保護級別隨時間而改變,以避免已知的 缺點。默認值將取決於個人機 構造而變化,並在其上安裝的軟件,並在其上已經施加 補丁。

here

+0

.NET 4.6.1的默認安全協議不是TLS 1.2 - 您必須將ServicePointManager.SecurityProtocol的值設置爲它來添加支持 –

+0

這是如何回答問題的?該OP說TLS1.2沒有工作時,它應該 –

+0

我明白這個問題,因爲「我什麼也沒做,預計TLS 1.2工作」 –

4

摘自我也有類似的問題,這是對我工作。

1)開放Powershell的,並通過使用[Net.ServicePointManager] :: SecurityProtocol

2)運行以下2只小命令檢查所支持的協議。

設置強大的加密64位.Net框架(版本4及以上)

的Set-ItemProperty -Path 'HKLM:\ SOFTWARE \ Microsoft.NetFramework \ v4.0.30319' - 名稱 'SchUseStrongCrypto' - 值 '1' - 類型雙字

在32位.Net框架(版本4及以上)

的Set-ItemProperty -Path「HKLM 設置強加密:\ SOFTWARE \ Microsoft.NetFramework \ v4.0.30319 '-Name'SchUseStrongCrypto'-Value'1'-Type DWord

3)重新啓動Powershell的和支持的協議,通過使用[Net.ServicePointManager] :: SecurityProtocol

現在應該顯示tls1.2以及再次檢查。

希望這有助於

+0

這應該當然適用於安裝了.NET 4.6+的.NET 4.x應用程序代碼。 – user24601

6

之所以安全協議沒有默認TLS 1.2是因爲在.NET框架4.6.1這個沒有默認值。對不起,如果這是重申已經說過的話,但我想說明一下,我沒有足夠的評論聲望。

4.6.2中沒有默認值,但是就像上面提到的評論者之一一樣,控制檯應用似乎默認爲TLS 1.2。我在4.6.2的網站項目中嘗試了完全相同的代碼,並且它沒有默認爲TLS 1.2。

4.7及以上版本的默認值爲SecurityProtocolType.SystemDefault。

「這允許基於SslStream(例如FTP,HTTP,SMTP和)的.NET Framework聯網API來從操作系統或從由系統管理員執行的任何定製配置繼承默認安全協議」

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.securityprotocol?view=netframework-4.7#System_Net_ServicePointManager_SecurityProtocol

2

正如其他人提到的那樣,有許多Windows註冊表項必須設置爲在現有.NET應用程序中啓用TLS 1.2,而無需在應用程序代碼中明確設置協議版本。

爲了使默認.NET 4.x code select the strongest available protocol(即,當未明確地在代碼中指定的協議),需要以下注冊表項:

在Windows的32位和64位版本: HKLM\SOFTWARE\Microsoft\.NETFramework\4.0.30319\SchUseStrongCrypto: 0X00000001

在Windows的64位版本: HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\4.0.30319\SchUseStrongCrypto: 0X00000001

的在64位系統上運行時,需要10個值才能在32位應用程序中啓用TLS 1.2。

但這裏有一個快速和簡單的解決方案: https://github.com/TheLevelUp/pos-tls-patcher

+1

我認爲這應該是被接受的答案。我們遇到了同樣的問題並觀察到以下情況:正常的.Net EXE按預期工作。在本機進程中託管的程序集(例如IIS,Office Addin)僅在使用TLS 1.2時才進行註冊表設置。 –

+0

@StefanEgli我感到你的痛苦。不知道爲什麼這些信息沒有更好的記錄。我們正試圖說出:http://blog.thelevelup.com/pci-security-is-your-restaurant-ready/ – user24601

+0

@StefanEgli如果您想在本機代碼中使用TLS 1.2,則還需要Schannel註冊表項集:https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12 – user24601

0

我用這個在我的代碼最初的頁面上。該應用程序是在.NET Framework 4.6.1的VB.NET中的Web表單。

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 
+0

這實際上覆蓋了所有其他版本,更不用說它不回答問題。 – kuskmen