Windows Server 2019 現已依憑證繫結提供 TLS 版本強制執行功能

本篇文章撰寫者

客戶安全性與信任首席安全性計劃經理 Andrew Marshall

核心網路首席計劃經理 Gabriel Montenegro

核心網路資深軟體工程師 Niranjan Inamdar

Internet Information Services 資深軟體工程師 Michael Brown

核心網路首席軟體工程主管 Ivan Pashov

2019 年 8 月

隨著全球工程師致力於排除對 TLS 1.0 的依賴,他們同時也面臨著平衡自身安全性需求和其客戶移轉準備的複雜挑戰。 到目前為止,我們已協助客戶藉由 將 TLS 1.2 支援新增至舊版作業系統來解決這些問題,方法是在 IIS 中傳送新的記錄格式來偵測用戶端的弱式 TLS 使用量 ,並提供最新的 技術指引來消除 TLS 1.0 相依性

現在 Microsoft 很榮幸宣佈 Windows 有一項功能強大的新功能,讓您可以更輕鬆地轉換到 TLS 1.2+ 的世界。 從 KB4490481 開始,Windows Server 2019 現已可讓您禁止弱式 TLS 版本與您指定的個別憑證一起使用。 我們稱之為「停用舊版 TLS」功能,它會在您所選取的任何憑證上有效地強制執行 TLS 版本和加密套件樓層。

停用舊版 TLS 也可讓線上服務在相同的硬體上提供兩個不同的端點群組:一個只允許 TLS 1.2+ 流量,另一個則容納舊版 TLS 1.0 流量。 變更會在HTTP.sys中實作,並在發行其他憑證時允許流量路由傳送至具有適當 TLS 版本的新端點。 在推出這項變更之前,部署這類功能需要投資更多硬體,因為這類設定只能透過登錄在系統範圍內進行設定。

功能實例詳細資料

常見的部署實例是在資料中心內使用一組硬體,其內含需求各自不同的客戶:某些立即需要 TLS 1.2 作為強制使用的下限,其他的則尚未移除 TLS 1.0 相依性。 圖 1 說明 TLS 版本選擇和憑證繫結是截然不同的動作。 此為預設功能:

預設的 TLS 版本選擇

圖 1:預設的 TLS 版本選擇與憑證繫結功能

  • secure.contoso.com 將您的客戶導向僅支援 TLS 1.2 和更新版本的服務端點。

  • legacy.contoso.com 指示具有舊版 TLS 1.0 的客戶需要 (,例如仍移轉至 TLS 1.2) 的端點,該端點支援 TLS 1.0 一段時間。 如此可讓客戶完成 TLS 1.2 的整備測試而不中斷服務,也不封鎖其他已準備好使用 TLS 1.2 的客戶。

傳統上,您需要兩個實際不同的主機來處理所有流量,並提供 TLS 版本強制執行,因為以最低通訊協定版本的服務 TLS 要求需要透過全系統登錄設定停用較弱的通訊協定。 而目前這項功能已置於更高層,其中 TLS 工作階段會繫結至憑證,因此可以指派特定的最低 TLS 版本,如下方的圖 2 所述。

為所選憑證強制使用最低的 TLS 版本

圖 2:為所選憑證強制使用最低 TLS 版本的停用舊版 TLS 功能,Secure.contoso.com。

功能部署指導

停用舊版 TLS 功能可以透過 Internet Information Services (IIS) 伺服器 UI、PowerShell 命令或 C++ HTTP.sys API 進行部署。

選項 #1:WINDOWS 10 2004 版和 Windows Server 版本 2004 和更新版本) 中提供的 IIS UI 組態 (

建立 SSL 憑證 “secure.contoso.com” 的網站繫結 (如下所示),然後選取 [停用舊版 TLS],再按一下 [確定]。

IIS UI

選項 #2:Windows 10 2004 版和 Windows Server 2004 版和更新版本) 中可用的 PowerShell (

您可以在 PowerShell 中參考 SSL 旗標,如下所示:

[Microsoft.Web.Administration.SslFlags]::DisableLegacyTLS

為其建立較短的命名變數十分方便:

$Sni = [Microsoft.Web.Administration.SslFlags]::Sni
    
$Sni\_CCS = [Microsoft.Web.Administration.SslFlags]::Sni + [Microsoft.Web.Administration.SslFlags]::CentralCertStore
    
$CCS = [Microsoft.Web.Administration.SslFlags]::CentralCertStore
    
$DisableLegacyTLS = [Microsoft.Web.Administration.SslFlags]::DisableLegacyTLS
    
 $storeLocation = "Cert:\\LocalMachine\\My"

建立對新網站的網站繫結,及停用舊版 TLS 的範例:

$BindingInformation = "\*:443:"

$siteName = "contoso"

$Thumbprint = $certificate.ThumbPrint

New-IISSite 與 Sslflag DisableLegacyTLS 屬性值:

New-IISSite $siteName "$env:systemdrive\\inetpub\\wwwroot" "\*:443:secure.contoso.com" https $certificate.Thumbprint $DisableLegacyTLS $storeLocation -passthru

新增對現有網站的網站繫結,及停用舊版 TLS 的範例:

New-IISSiteBinding -Name "Default Web Site" -BindingInformation $BindingInformation -CertificateThumbPrint $certificate.Thumbprint -Protocol https -SslFlag $DisableLegacyTLS, $CCS -Force -verbose

此外,您也可以使用 Netsh 來對此功能進行疑難排解及測試:

  • 新增繫結:

    netsh HTTP add sslcert < regular parameters > disablelegacytls=enable

  • 更新現有的繫結:

    netsh HTTP update sslcert < 一般參數 > disablelegacytls=enable

  • 檢查是否已在系結上設定:

    netsh http show sslcert <正規參數>

    監看停用舊版 TLS 版本:設定/未設定

選項 #3:C++ HTTP.sys API (現已提供)

除了停用舊版 TLS 以外,我們也已對 HTTP.sys 新增了下列項目:

  • HTTP_SERVICE_CONFIG_SSL_PARAM。DefaultFlags 現在支援下列新值:

  • HTTP_SERVICE_CONFIG_SSL_FLAG_ENABLE_SESSION_TICKET:針對特定 SSL 端點啟用/停用會話票證。

  • HTTP_SERVICE_CONFIG_SSL_FLAG_LOG_EXTENDED_EVENTS:針對特定 SSL 端點啟用/停用擴充事件記錄。 其他事件會記錄到 Windows 事件記錄檔。 目前只有一個支援的事件,會在 SSL 交握失敗時記錄。

  • HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS:針對特定 SSL 端點啟用/停用舊版 TLS 版本。 設定此旗標會停用該端點的 TLS1.0/1.1,並限制可用於 HTTP2 加密套件的加密套件。

  • HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_TLS12:針對特定 SSL 端點啟用/停用 TLS1.2。

  • HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_HTTP2:針對特定 SSL 端點啟用/停用 HTTP/2。

在 C++ 中啟用/停用此功能的最簡單方式是使用 HttpSetServiceConfiguration HTTP.sys API 所提供的HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS旗標。

設定完好停用舊版 TLS 之後,就會強制施行下列限制:

  • 停用 SSL2、SSL3、TLS1.0 和 TLS1.1 通訊協定。

  • 停用加密密碼 DES、3DES 和 RC4 (因此只會使用 AES)。

  • 使用 CBC 鏈結模式停用加密加密 AES (,因此只會使用 AES GCM) 。

  • 停用 RSA 金鑰交換。

  • 停用金鑰大小小於 2048 的 DH 金鑰交換。

  • 停用金鑰大小小於 224 的 ECDH 金鑰交換。

涵蓋這些變更的正式文件即將在 docs.Microsoft.com 上推出。

強制使用 TLS 版本的後續步驟

停用舊版 TLS 提供強大的新功能,可在特定憑證/端點繫結上強制使用 TLS 版本/加密套件層。 其也要求您要規劃在啟用此功能時所發行的憑證之命名方式。 一些考量包括:

  • 我想要讓服務端點的預設路徑立即強制執行 TLS 1.2,並為需要 TLS 1.0 的使用者提供不同的憑證作為備份「舊版」存取點?

  • 我的預設、已使用中的 Contoso 認證是否應該使用停用舊版 TLS? 如果是的話,我需要提供 legacy.contoso.com 憑證,並將其繫結至允許 TLS 1.0 的端點。

  • 如何最好地將這些憑證的使用方式傳達給客戶?

您可以利用這項功能來符合大型客戶群組的需求,這些客戶必須義務使用 TLS 1.2+ ,且那些客戶仍會從 TLS 1.0 移轉,完全不需要額外的硬體支出。 除了 Windows Server 2019 中目前每個憑證 TLS 版本系結的可用性之外,Microsoft 也會根據客戶需求,在其線上服務上提供停用舊版 TLS。