HTTPS 與 TLS 實際運作原理:實用指南
你大概看過瀏覽器裡的鎖頭圖示,也知道它代表「安全」。但當使用者在你的網域前輸入 https:// 時,實際發生了什麼事?如果你是開發者,理解 HTTPS 與 TLS 的運作機制不只是紙上談兵——它能幫助你除錯連線問題、選擇正確的憑證,並避免微妙的安全錯誤。
本指南以淺顯的語言拆解 TLS 握手、憑證驗證與加密,並提供可應用於自己專案的實用範例。
HTTPS 究竟是什麼
HTTPS 就是將 HTTP layered 在 TLS(Transport Layer Security,傳輸層安全性)之上。TLS 提供三項保證:
- 加密: 用戶端與伺服器之間交換的資料對竊聽者而言無法讀取。
- 認證: 伺服器使用由受信任機構簽署的憑證來證明其身分。
- 完整性: 訊息在傳輸過程中若被修改,將可被偵測。
沒有 TLS,HTTP 會以純文字傳送所有內容——密碼、Cookie 和個人資料對網路路徑上的任何人都一覽無遺。
淺談 TLS 握手
在任何 HTTP 資料傳送之前,用戶端與伺服器會執行握手,以協商加密參數。TLS 1.3(現代標準)將其簡化為單次往返。
逐步解析:TLS 1.3 握手
- Client Hello: 用戶端傳送支援的加密套件清單、TLS 版本,以及金鑰交換用的公開金鑰(key share)。
- Server Hello: 伺服器選擇一個加密套件,傳送自己的金鑰交換,並提供其憑證鏈。
- 金鑰衍生: 雙方使用 Diffie-Hellman 金鑰交換,獨立計算出相同的共享密鑰。此密鑰從不透過網路傳送。
- Finished: 用戶端與伺服器交換加密的「Finished」訊息,以確認握手成功。
完成這些步驟後,應用程式資料(HTTP 請求和回應)便會使用從共享密鑰衍生的對稱金鑰進行加密。
以下是握手流程的簡化示意圖:
Client Server
| |
|-------- ClientHello (key share) ---->|
| |
|<------- ServerHello (key share, -----|
| certificate, Finished) |
| |
|-------- Finished ------------------->|
| |
|<====== Encrypted HTTP Data =========>|
在 TLS 1.2 中,握手需要兩次往返,並包含獨立的金鑰交換步驟。TLS 1.3 降低了延遲並移除了較弱的演算法。
憑證如何建立信任
TLS 憑證將公開金鑰綁定到網域名稱,並由憑證授權單位(CA)簽署。當你的瀏覽器連線到伺服器時,它會檢查:
- 簽章鏈: 憑證必須能鏈回瀏覽器信任儲存區中的受信任根 CA。
- 網域符合: 憑證的主體別名(SAN)必須包含請求的主機名稱。
- 有效期間: 憑證不得過期或尚未生效。
- 撤銷狀態: 瀏覽器可能會檢查 OCSP 或 CRL,以確保憑證未被撤銷。
若任何檢查失敗,瀏覽器會顯示警告。Let's Encrypt 推廣了免費、自動化的憑證,讓所有人都能使用 HTTPS。
憑證類型一覽
| 類型 | 驗證等級 | 典型用途 |
|---|---|---|
| 網域驗證(DV) | 僅驗證網域控制權 | 個人網站、部落格、API |
| 組織驗證(OV) | 網域 + 組織身分 | 企業網站 |
| 延伸驗證(EV) | 嚴格的身分驗證 | 金融機構、高信任度網站 |
對大多數開發者而言,來自 Let's Encrypt 的 DV 憑證已足夠,且可使用 Certbot 等工具自動續訂。
加密:對稱與非對稱
TLS 同時使用兩種加密類型:
- 非對稱(公開金鑰)密碼學: 在握手期間用於驗證伺服器並安全地交換共享密鑰。演算法包括 RSA 和 ECDHE。
- 對稱加密: 握手後用於大量資料加密。演算法包括 AES-GCM 和 ChaCha20-Poly1305。
對稱加密的速度快得多,因此用於實際的資料傳輸。握手的工作就是安全地建立該對稱金鑰。
常見陷阱與避免方法
1. 混合內容
如果你的 HTTPS 頁面透過 HTTP 載入資源(圖片、指令碼、樣式),瀏覽器可能會封鎖它們或顯示警告。請一律使用相對 URL 或明確的 HTTPS URL。
2. 弱加密套件
停用過時的協定(TLS 1.0、TLS 1.1)和弱加密演算法(RC4、3DES)。現代伺服器應僅支援 TLS 1.2 和 1.3,並使用具備前向保密的加密套件。
3. 憑證過期
過期的憑證會立即導致瀏覽器錯誤。使用 Let's Encrypt 自動續訂,並設定監控以在到期前發出警示。
4. 錯誤的鏈結配置
伺服器必須傳送完整的憑證鏈(根憑證除外)。缺少中繼憑證會導致某些用戶端失敗。使用 SSL Labs 等工具測試你的憑證鏈。
5. HSTS 配置錯誤
HTTP 嚴格傳輸安全(HSTS)會強制瀏覽器使用 HTTPS,但一旦設定,就很難撤銷。請從較短的 max-age 開始,再逐步增加。
除錯 TLS 問題
當 HTTPS 失敗時,這些命令有助於診斷問題:
# 檢查憑證詳細資料與鏈結
openssl s_client -connect example.com:443 -servername example.com
# 測試 TLS 版本與加密套件
nmap --script ssl-enum-ciphers -p 443 example.com
# 驗證憑證到期時間
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
SSL Labs 等線上工具提供全面的評分和配置回饋。
常見問題
TLS 和 SSL 有什麼區別?
SSL(Secure Sockets Layer)是 TLS 已棄用的前身。現代系統使用 TLS 1.2 或 1.3;「SSL」常被口語化使用,但這些協定並不相同。
HTTPS 會拖慢我的網站嗎?
現代 TLS 增加的延遲極小——使用 TLS 1.3 和工作階段恢復時,通常只有幾毫秒。安全效益遠大於微小的額外開銷。
我應該多久更新一次 TLS 憑證?
大多數憑證的有效期為 90 天(Let's Encrypt)或最長一年。請自動化續訂並設定監控,以避免意外過期。
準備好檢查自己的憑證了嗎?使用 Nginx 日誌分析器 來發現 TLS 握手錯誤,並監控伺服器日誌中的 HTTPS 流量模式。