HTTPS 與 TLS 的真正運作原理:深入解析
你輸入一個網址,按下 Enter,然後看到鎖頭圖示。但你的瀏覽器和伺服器之間究竟發生了什麼,讓這個連線變得安全?許多開發者把 HTTPS 當成黑盒子——直到出了問題,比如憑證錯誤或效能問題。本文將揭開 HTTPS 和 TLS 的神祕面紗,用實用的方式解釋手握手續、加密和憑證驗證。
HTTPS 到底是什麼
HTTPS 簡單來說就是將 HTTP 置於 TLS(Transport Layer Security,傳輸層安全性)之上。TLS 提供三項保證:
- 機密性: 資料經過加密,竊聽者無法讀取。
- 完整性: 資料在傳輸過程中若被修改,會被偵測到。
- 認證: 你正在與真正的伺服器通訊,而非冒充者。
TLS 是從 SSL(Secure Sockets Layer,安全通訊端層)演進而來。你應該使用現代版本(TLS 1.2 和 1.3);SSL 已被棄用。
TLS 手握手續:逐步解析
在任何 HTTP 資料流動之前,用戶端和伺服器會執行手握手續,以協商加密金鑰。以下是典型的 TLS 1.3 手握手續(簡化版)中發生的事:
- Client Hello: 瀏覽器發送支援的加密套件清單、一個隨機值,以及用於金鑰交換的金鑰共享。
- Server Hello: 伺服器選擇一個加密套件,發送自己的隨機值和金鑰共享,並出示其憑證。
- 金鑰衍生: 雙方使用 Diffie-Hellman 金鑰交換計算出相同的共享密鑰。由此,他們衍生出用於對稱加密的會話金鑰。
- Finished: 雙方發送 MAC(訊息驗證碼)以驗證手握手續的完整性。加密的應用程式資料現在可以流動了。
TLS 1.3 將手握手續減少到一個往返(1-RTT),甚至支援會話恢復的 0-RTT,從而改善延遲。
金鑰交換:Diffie-Hellman
現代 TLS 的魔力在於,用戶端和伺服器可以在從未傳輸共享密鑰的情況下就共享密鑰達成一致。Diffie-Hellman(具體來說是橢圓曲線的 ECDHE)允許這樣做。即使攻擊者記錄了整個手握手續,他們也無法衍生出會話金鑰——這種特性稱為前向保密。
對稱加密:AES 或 ChaCha20
一旦建立了共享密鑰,TLS 就會切換到對稱加密(如 AES-GCM 或 ChaCha20-Poly1305),因為它比非對稱加密快得多。會話金鑰用於加密所有應用程式資料。
憑證驗證:信任但驗證
伺服器的憑證是認證的核心。它包含伺服器的公開金鑰,並由憑證授權單位(CA)簽署。以下是瀏覽器驗證它的方式:
- 信任鏈: 憑證必須鏈結到瀏覽器或作業系統中預先安裝的受信任根 CA。
- 主機名稱匹配: 憑證必須對你造訪的網域有效(透過主體別名)。
- 有效期限: 憑證不能過期或尚未生效。
- 撤銷檢查: 瀏覽器可能會檢查 OCSP 或 CRL,以確保憑證未被撤銷。
如果任何檢查失敗,你會收到警告——例如「你的連線不是私人連線」。
常見的 TLS 錯誤配置
即使啟用了 HTTPS,錯誤也可能削弱安全性:
- 過時的協定: 支援 TLS 1.0/1.1 或 SSLv3 會讓你暴露於已知攻擊。
- 弱加密套件: 允許 RC4 或 CBC 模式加密套件而沒有緩解措施。
- 缺少 HSTS: 沒有 HTTP 嚴格傳輸安全性,使用者可能被降級到 HTTP。
- 憑證管理不當: 憑證過期或鏈結配置不正確。
使用 SSL Labs 的 SSL Test 等工具來檢查你的配置。
實用範例:使用 Nginx 啟用 HTTPS
以下是一個安全的 HTTPS 伺服器的最小 Nginx 配置:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
root /var/www/html;
index index.html;
}
}
此配置使用 Let's Encrypt 憑證,僅啟用 TLS 1.2 和 1.3,並設定 HSTS。
常見問題
TLS 和 SSL 有什麼區別?
TLS 是 SSL 的後繼者。SSL 版本(2.0、3.0)因安全漏洞而被棄用。當人們說「SSL 憑證」時,通常指的是 TLS 憑證。
HTTPS 會讓我的網站變慢嗎?
現代 TLS(1.3)增加的延遲極小——通常只有幾毫秒。透過會話恢復和 HTTP/2,HTTPS 可以與 HTTP 一樣快,甚至更快。
如何取得免費的 TLS 憑證?
Let's Encrypt 提供免費、自動化的憑證。像 Certbot 這樣的工具可以為你取得並續訂它們。
結論
HTTPS 和 TLS 並非魔法——它們是設計良好的協定,結合了用於認證的公開金鑰密碼學和用於速度的對稱加密。了解手握手續和憑證驗證有助於你除錯問題並安全地配置伺服器。始終使用 TLS 1.2 或 1.3,保持憑證更新,並啟用 HSTS。
若要分析伺服器日誌以找出 TLS 錯誤或效能問題,試試我們的 Nginx 日誌分析器。