傳輸層安全 (TLS)
任何使用傳輸層安全 (TLS) 的連線的安全性在很大程度上取決於所選的密碼套件和安全引數。本文的目的是幫助您做出這些決定,以確保客戶端和伺服器之間通訊的機密性和完整性。Mozilla 運營安全 (OpSec) 團隊維護了一個 wiki 條目,其中包含伺服器的參考配置。
傳輸層安全 (TLS) 協議是使兩個網路應用程式或裝置能夠私密而健壯地交換資訊的標準。使用 TLS 的應用程式可以選擇其安全引數,這可能對資料的安全性和可靠性產生重大影響。本文概述了 TLS 以及在保護您的內容時需要做出的各種決策。
History
當 HTTPS 推出時,它基於 Netscape 推出的技術 Secure Sockets Layer (SSL) 2.0。不久之後,它更新到 SSL 3.0,隨著其使用範圍的擴大,很明顯需要指定一種通用的、標準的加密技術來確保所有 Web 瀏覽器和伺服器之間的互操作性。 網際網路工程任務組 (IETF) 在 1999 年 1 月的 RFC 2246 中指定了 TLS 1.0。TLS 的當前版本是 1.3(RFC 8446)。
儘管現在 Web 使用 TLS 進行加密,但許多人出於習慣仍稱其為“SSL”。
雖然 TLS 可以建立在任何低階傳輸協議之上,但該協議的最初目標是加密 HTTP 流量。使用 TLS 加密的 HTTP 通常稱為 HTTPS。預設情況下,TLS 加密的 Web 流量約定使用埠 443 進行交換,而未加密的 HTTP 預設使用埠 80。HTTPS 仍然是 TLS 的重要用例。
基於 TLS 的 HTTP
TLS 提供三項主要服務,有助於確保與其交換資料的安全性和可靠性
- 身份驗證
-
身份驗證允許通訊的每一方驗證另一方是否是其聲稱的那個人。
- 加密
-
資料在使用者代理和伺服器之間傳輸時會被加密,以防止未經授權的方讀取和解釋。
- 完整性
-
TLS 確保在加密、傳輸和解密資料之間,沒有資訊丟失、損壞、篡改或偽造。
TLS 連線以握手階段開始,在此階段,客戶端和伺服器就共享金鑰和重要引數(如密碼套件)達成一致。一旦引數和資料交換模式被協商好,就可以交換應用程式資料,例如 HTTP。
密碼套件
TLS 握手協商的主要引數是 密碼套件。
在 TLS 1.2 及更早版本中,協商的密碼套件包含一組加密演算法,這些演算法共同提供共享金鑰的協商、伺服器進行身份驗證的方式以及用於加密資料的方法。
TLS 1.3 中的密碼套件主要負責資料加密,金鑰協商和身份驗證使用單獨的協商方法。
不同的軟體可能對相同的密碼套件使用不同的名稱。例如,OpenSSL 和 GnuTLS 中使用的名稱與 TLS 標準中的名稱不同。Mozilla OpSec 團隊關於 TLS 配置的文章中的 密碼名稱對應表 列出了這些名稱以及相容性和安全級別資訊。
配置您的伺服器
正確配置伺服器至關重要。一般來說,您應該嘗試將密碼支援限制在與您希望連線到您站點的瀏覽器相容的最新密碼上。 Mozilla OpSec TLS 配置指南 提供了有關推薦配置的更多資訊。
為了幫助您配置您的站點,Mozilla 提供了一個有用的 TLS 配置生成器,它可以為以下 Web 伺服器生成配置檔案
- Apache
- Nginx
- Lighttpd
- HAProxy
- Amazon Web Services CloudFormation Elastic Load Balancer
使用 配置器 是建立滿足您需求的配置的推薦方法;然後將其複製並貼上到您伺服器上的相應檔案中,然後重新啟動伺服器以應用更改。配置檔案可能需要進行一些調整以包含自定義設定,因此請務必在使用的生成配置之前對其進行審查;如果不確保域名引用等正確而安裝配置檔案,將導致伺服器無法正常工作。
TLS 1.3
RFC 8446:TLS 1.3 是對 TLS 的重大修訂。TLS 1.3 包含許多改進安全性和效能的更改。TLS 1.3 的目標是
- 移除 TLS 1.2 中未使用且不安全的功能。
- 在設計中包含強大的安全分析。
- 透過加密協議的更多部分來提高隱私性。
- 減少完成握手所需的時間。
TLS 1.3 改變了協議的許多基本原理,但保留了之前 TLS 版本幾乎所有的基本功能。對於 Web 而言,在不影響相容性的情況下可以啟用 TLS 1.3,但有一些罕見的例外(如下所述)。
TLS 1.3 的主要變化是
- 在大多數情況下,TLS 1.3 握手完成於一次往返,從而降低了握手延遲。
- 伺服器可以啟用 0-RTT(零往返時間)握手。重新連線到伺服器的客戶端可以立即傳送請求,從而完全消除了 TLS 握手的延遲。雖然 0-RTT 的效能提升可能很顯著,但伴隨著重放攻擊的風險,因此在啟用此功能之前需要謹慎。
- TLS 1.3 僅支援前向保密模式,除非連線正在恢復或使用預共享金鑰。
- TLS 1.3 定義了一組新的、僅 TLS 1.3 專有的密碼套件。這些密碼套件都使用現代的帶關聯資料的認證加密 (AEAD) 演算法。
- TLS 1.3 握手是加密的,除了建立共享金鑰所需的那些訊息。特別是,這意味著伺服器和客戶端證書是加密的。但請注意,客戶端傳送給伺服器的伺服器身份(server_name 或 SNI 擴充套件)未加密。
- 許多機制已被停用:重協商、通用資料壓縮、數字簽名演算法 (DSA) 證書、靜態 RSA 金鑰交換以及自定義 Diffie–Hellman (DH) 組的金鑰交換。
TLS 1.3 草案版本的實現已可用。TLS 1.3 已在某些瀏覽器中啟用,包括 0-RTT 模式。啟用 TLS 1.3 的 Web 伺服器可能需要調整配置以允許 TLS 1.3 成功執行。
TLS 1.3 增加了一個重要的新的用例。0-RTT 握手可以為對延遲敏感的應用程式(如 Web)提供顯著的效能提升。啟用 0-RTT 需要額外的步驟,以確保成功部署並管理重放攻擊的風險。
TLS 1.3 中移除重協商可能會影響某些依賴客戶端證書身份驗證的 Web 伺服器。一些 Web 伺服器使用重協商來確保客戶端證書被加密,或僅在請求某些資源時才請求客戶端證書。為了保護客戶端證書的隱私,TLS 1.3 握手的加密確保了客戶端證書的加密;但這可能需要一些軟體更改。TLS 1.3 支援對證書進行響應式身份驗證,但尚未得到廣泛實施。正在開發替代機制,這些機制也將支援 HTTP/2。
棄用舊版 TLS
為了幫助構建一個更現代、更安全的 Web,所有主流瀏覽器從 2020 年初開始就已停止支援 TLS 1.0 和 1.1。您需要確保您的 Web 伺服器在未來支援 TLS 1.2 或 1.3。
從 74 版本開始,當連線到使用舊 TLS 版本的伺服器時,Firefox 將返回一個安全連線失敗錯誤(Firefox bug 1606734)。
TLS 握手超時值
如果 TLS 握手由於某種原因開始變得緩慢或無響應,使用者體驗可能會受到嚴重影響。為了緩解這個問題,現代瀏覽器已經實現了握手超時
- 自 58 版本起,Firefox 實現了一個 TLS 握手超時,預設值為 30 秒。可以透過在 about:config 中編輯
network.http.tls-handshake-timeout首選項來更改超時值。
另見
- Mozilla SSL 配置生成器和 Cipherlist.eu 可以幫助您為伺服器生成配置檔案以保護您的站點。
- Mozilla 運營安全 (OpSec) 團隊維護著一個 wiki 頁面,其中包含參考 TLS 配置。
- 使用 HTTP Observatory 和 SSL Labs 來測試網站的 HTTP/TLS 配置有多安全。
- 安全上下文
- Strict-Transport-Security HTTP 頭