HTTPS 與 TLS 真正如何運作:實用指南
為什麼 HTTPS 很重要
每次你造訪網站時,你都信任連線是私密的,且網站就是它聲稱的身分。HTTPS(超文本傳輸協定安全版)是讓這一切成為可能的協定,它將 HTTP 層疊在 TLS(傳輸層安全性)之上。沒有它,密碼、信用卡號和個人資料將以明文傳輸,輕易被同一網路上的任何人攔截。
在本指南中,我們將解析 HTTPS 和 TLS 的實際運作方式——從建立安全通道的握手到保護資料的加密。你將看到關鍵概念、涉及的步驟,以及確保自己網站妥善受到保護的實用技巧。
TLS 握手:建立信任
在任何資料交換之前,客戶端(瀏覽器)和伺服器會執行 TLS 握手。此過程驗證伺服器、協商加密演算法並產生會話金鑰。具體步驟因 TLS 版本而異,但核心概念相似。
逐步解析:TLS 1.2 握手
- Client Hello: 客戶端發送包含支援的 TLS 版本、密碼套件和隨機值(Client Random)的訊息。
- Server Hello: 伺服器回應其選擇的 TLS 版本、密碼套件、隨機值(Server Random)和數位憑證。
- 憑證驗證: 客戶端根據受信任的憑證授權機構(CA)檢查憑證,並驗證伺服器身分。
- 金鑰交換: 使用 ECDHE 等演算法,雙方計算出共享的預主密鑰,而不直接傳輸它。
- 會話金鑰: 雙方從預主密鑰和隨機值推導出相同的會話金鑰。
- 完成: 每一方發送 MAC 以確認握手完整性;加密通訊開始。
TLS 1.3 將此簡化為單次往返(1-RTT),甚至支援 0-RTT 恢復以用於重複連線,顯著降低延遲。
加密:對稱與非對稱
TLS 同時使用非對稱和對稱加密。非對稱(公開金鑰)密碼學用於握手期間安全地交換金鑰。一旦建立會話金鑰,對稱加密(如 AES 或 ChaCha20)便接管大量資料傳輸,因為它快得多。
現代密碼套件使用具有關聯資料的認證加密(AEAD),例如 AES-GCM 或 ChaCha20-Poly1305,一步提供機密性和完整性。
憑證與信任鏈
數位憑證將公開金鑰綁定到身分(如網域名稱),並由憑證授權機構(CA)簽署。瀏覽器和作業系統附帶受信任的根 CA 儲存庫。當伺服器出示其憑證時,客戶端會驗證:
- 憑證由受信任的 CA 簽署(直接或透過中間 CA)。
- 憑證在其有效期限內。
- 網域名稱符合憑證的主體別名(SAN)。
- 憑證未被撤銷(透過 OCSP 或 CRL)。
如果任何檢查失敗,瀏覽器會顯示警告。Let's Encrypt 和其他 CA 提供免費憑證,讓所有人都能使用 HTTPS。
常見的 TLS 配置錯誤
即使啟用了 HTTPS,錯誤配置也可能削弱安全性。請注意:
- 過時的協定: 停用 TLS 1.0 和 1.1;偏好 TLS 1.2 或 1.3。
- 弱密碼套件: 避免 RC4、DES 或出口級密碼。
- 缺少 HSTS: 新增 Strict-Transport-Security 標頭以防止降級攻擊。
- 憑證不符: 確保憑證涵蓋所有子網域,並在到期前續約。
測試你的 HTTPS 設定
使用 SSL Labs 的 SSL Test 等線上工具為你的配置評分。透過啟用 TLS 1.3、使用強密碼和實作 HSTS,目標是獲得 A 或 A+。定期監控憑證到期——使用 Certbot 等 ACME 客戶端自動續約。
常見問題
HTTPS 和 TLS 有什麼區別?
HTTPS 是層疊在 TLS 上的 HTTP。TLS 是提供加密、驗證和完整性的密碼協定。HTTPS 是使用 TLS 的 HTTP 安全版本。
TLS 1.3 如何提升效能?
TLS 1.3 將握手減少到一次往返(1-RTT),並支援 0-RTT 恢復,從而降低延遲。它還移除了過時的演算法,簡化了配置。
每個子網域都需要單獨的憑證嗎?
你可以使用 *.example.com 的萬用字元憑證或多網域憑證(SAN)來涵蓋多個主機名稱。Let's Encrypt 免費提供這兩種選項。
準備好檢查自己的 TLS 流量了嗎?使用我們的 Nginx 日誌分析器 來解析存取日誌,並發現可疑模式或失敗的 TLS 握手。