系統停用 TLS 1.0 時,讓現有 .NET 程式支援 TLS 1.2 的處理方式。

背景資訊

現有程式的 .NET Framework 版本,有:

  • 3.5 WebForms
  • 4.5 WebForms, 4.5, 4.7 MVC
  • Core 2.1

專案的執行環境

  • Windows Server 2008 R2 SP1

最佳做法

  • 將應用程式調整為使用作業系統(OS)所支援的 TLS 版本。
  • 在 Windows 上啟用 TLS 1.2。

使用作業系統(OS)所支援的 TLS 版本

為了確保 .NET Framework 應用程式的安全性,TLS 版本最好不要寫死在程式中。應使用作業系統(OS)所支援的 TLS 版本。

  • ASP.NET 應用程式以 .NET Framework 4.7 或更新版本作為目標,預設就會使用 OS 決定的 TLS 版本。
  • WCF 應用程式以 .NET Framework 4.7.1 或更新版本作為目標,預設就會使用 OS 決定的 TLS 版本。
  • 確認程式中沒有指定 TLS 版本。

當應用程式讓 OS 選擇 TLS 版本時有以下優點:

  • 它會自動運用於未來新增的新通訊協定,例如 TLS 1.3。
  • OS 會封鎖被發現不安全的通訊協定。

調整應用程式的目標版本

針對 ASP.NET 應用程式,確認並調整 web.config 的 <system.web><httpRuntime targetFramework> 元素,使用正確的 .NET Framework 版本,如 4.7.1

調整專案目標版本

  • 在 Visual Studio 中進入專案的屬性頁。
  • 在 [屬性] 視窗的左欄中,選擇 [應用程式] 索引標籤。
  • 在 [目標 Framework] 清單中,選擇您要的版本。

目標 Framework

.NET Core 預設就會使用 OS 的版本。

2008 Server 上啟用 TLS 1.2

  • 安裝 KB3140245 更新,以支援 TLS 1.1 1.2。
  • 新增或修改 Registry,加入 2 個項目。

安裝 KB3140245 更新

到這裡 https://www.catalog.update.microsoft.com/search.aspx?q=kb3140245
找到對應的作業系統平台版本做下載及安裝。安裝後要重開機。

新增或修改 Registry

設定步驟可看 [參考資料 5]

總之就是在以下 2 個鍵中設定兩個值: DisabledByDefault = dword:0 及 Enabled = dword:1。

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server

最簡單做法,是把以下內容存成 XXX.reg 如 TLS12.reg,再執行它就好了。

1
2
3
4
5
6
7
8
9
10
11
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]

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

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

無法昇級 .NET Framework

原則是,如果無法避免在程式中寫死通訊協定版本,建議就指定 TLS 1.2。

.NET 3.5 以下不支援 TLS,昇級是必要的。

安裝修補程式

如果是 .NET Framework 3.5,便需要安裝修補程式,使程式可以指定 TLS 1.2:可靠性彙總套件 HR-1605。依平台別有 KB3154518KB3154519KB3154520KB3156421

在 Windows Server 2008 R2 SP1 內建安裝的 .NET Framework 3.5.1 已套用了 KB3154518 TLS 1.2 的更新,不用另行安裝。

程式中指定 TLS 1.2

可在 Global.asax 或 Global.asax.cs 中增加以下內容:

加 import

1
2
Imports System.Security.Authentication
Imports System.Net

程式碼

1
2
3
4
5
public const SslProtocols _Tls12 = (SslProtocols)0x00000C00;
public const SecurityProtocolType Tls12 = (SecurityProtocolType)_Tls12;

// 以下可以加在 Application_Start() 中
ServicePointManager.SecurityProtocol = Tls12

只要在執行外部呼叫前完成設定即可。

以上,開工吧!

參考資料及圖片來源

  1. .NET Framework 的傳輸層安全性 (TLS) 最佳做法
  2. 如何:將 .NET Framework 的某個版本設定為目標
  3. 在 Windows 中的 WinHTTP 中的預設安全通訊協定為啟用 TLS 1.1 和 TLS 1.2 的更新
  4. KB3140245 下載
  5. How to enable TLS 1.2 on Windows Server 2008 R2
  6. Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1
  7. .NET Framework 3.5 and TLS 1.2