HTTPS 與 TLS 真正如何運作:逐步指南
您可能已經在瀏覽器中看到鎖定圖示,並認為您的連線是安全的。但當您造訪 HTTPS 網站時,實際發生了什麼?您的瀏覽器如何知道它正在與真實的伺服器通訊,而不是冒充者?為什麼 TLS 有時會拖慢您的網站速度?
在本指南中,我們將逐步介紹握手過程,揭開 HTTPS 和 TLS 的神秘面紗。您將了解憑證、對稱與非對稱加密的作用,以及如何在您自己的專案中驗證和優化 TLS。
HTTPS 和 TLS 實際做什麼
HTTPS 是建立在 TLS(傳輸層安全性)之上的 HTTP。TLS 提供三項保證:
- 機密性:資料經過加密,竊聽者無法讀取。
- 完整性:資料在傳輸過程中無法被修改而不被偵測。
- 認證:您正在與合法的伺服器通訊,而不是攻擊者。
沒有 TLS,HTTP 流量以明文傳送。網路路徑上的任何人(Wi-Fi 熱點、ISP、被入侵的路由器)都可以讀取或更改它。TLS 透過在交換任何 HTTP 資料之前建立安全通道來解決這個問題。
TLS 握手:逐步解析
握手是神奇之處。這是一個協商過程,建立共享金鑰並驗證身分。以下是 TLS 1.2 和 1.3(您今天會遇到的兩個版本)的簡化流程。
步驟 1:客戶端問候 (Client Hello)
客戶端(瀏覽器)發送一個 ClientHello 訊息,包含:
- 支援的 TLS 版本(例如 TLS 1.3、TLS 1.2)
- 支援的加密套件(演算法的組合)
- 一個隨機位元組字串(客戶端隨機數)
- 對於 TLS 1.3,還包括用於 Diffie-Hellman 交換的金鑰共享
步驟 2:伺服器問候和憑證
伺服器回應一個 ServerHello(選擇的版本、加密套件、伺服器隨機數)及其憑證。憑證包含伺服器的公鑰,並由憑證授權單位 (CA) 簽署。
客戶端驗證憑證:是否過期?是否由受信任的 CA 簽發?網域是否匹配?如果沒有,瀏覽器會顯示警告。
步驟 3:金鑰交換
使用伺服器的公鑰(或 Diffie-Hellman 參數),客戶端和伺服器推導出共享的預主密鑰。在 TLS 1.3 中,這是使用臨時 Diffie-Hellman (ECDHE) 完成的,提供前向保密:即使伺服器的私鑰後來被洩露,過去的會話仍然安全。
步驟 4:完成
雙方發送一個使用新推導出的金鑰加密的 Finished 訊息。如果解密成功,握手完成。從那時起,所有應用程式資料(HTTP)都使用對稱加密(例如 AES-GCM 或 ChaCha20-Poly1305)加密。
TLS 1.3 的改進
TLS 1.3 將握手減少到一個往返 (1-RTT),並支援 0-RTT 恢復以服務重複訪客。它還移除了過時的演算法,使其更快、更安全。大多數現代瀏覽器和伺服器都支援 TLS 1.3。
TLS 中的對稱與非對稱加密
TLS 使用兩種類型的加密是有充分理由的:
- 非對稱(公鑰)加密:在握手期間用於驗證伺服器並安全地交換金鑰。它的計算成本較高,但解決了金鑰分發問題。
- 對稱加密:用於握手後的大量資料傳輸。它快速且高效。
這種混合方法為您提供了公鑰密碼學的安全性和對稱密碼的性能。
憑證:信任錨點
憑證將公鑰綁定到網域名稱,並由 CA 簽署。瀏覽器和作業系統附帶一個受信任根 CA 的存儲庫。當伺服器呈現其憑證時,客戶端會建立一條回到受信任根的信任鏈。
憑證的生命週期有限(現在通常為 90 天,使用 Let's Encrypt)。過期的憑證會導致瀏覽器錯誤,因此請自動化續訂。
實作:使用 OpenSSL 檢查 TLS
您可以使用 openssl 命令列工具檢查伺服器的 TLS 配置。這有助於除錯握手失敗或驗證加密套件。
openssl s_client -connect example.com:443 -servername example.com -tls1_3
這會連接到伺服器並列印憑證鏈、協商的加密和會話詳細資訊。尋找 Verify return code: 0 (ok) 以確認憑證有效。
檢查憑證到期時間:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
常見 TLS 陷阱及如何避免
- 憑證過期:設定自動續訂和監控。使用 Certbot 等工具處理 Let's Encrypt。
- 混合內容:在 HTTPS 頁面上載入 HTTP 資源會破壞安全性。使用相對 URL 或確保所有資源都是 HTTPS。
- 弱加密套件:停用過時的協定(TLS 1.0、1.1)和弱加密(RC4、3DES)。啟用 TLS 1.3。
- 缺少 HSTS:新增
Strict-Transport-Security標頭以強制未來造訪使用 HTTPS。 - 不完整的憑證鏈:某些伺服器忘記包含中繼憑證,導致某些客戶端出錯。使用 SSL Labs 測試。
優化 TLS 效能
TLS 因握手而增加延遲。以下是如何將其最小化:
- 啟用 TLS 1.3,它具有更快的握手。
- 使用會話恢復(會話票證或預共享金鑰)以避免重複訪客的完整握手。
- 啟用 OCSP 裝訂以減少憑證驗證延遲。
- 使用在邊緣終止 TLS 的 CDN 以減少往返時間。
- 保持憑證小巧(盡可能使用 ECDSA 而不是 RSA)。
常見問題
HTTPS 和 TLS 有什麼區別?
HTTPS 是 HTTP 的安全版本,而 TLS 是提供安全性的密碼學協定。HTTPS 使用 TLS 來加密和驗證連線。
TLS 如何提供前向保密?
前向保密確保即使伺服器的私鑰被洩露,過去的會話金鑰也無法被推導出來。這是透過在 TLS 1.3 和現代 TLS 1.2 配置中使用臨時 Diffie-Hellman 金鑰交換 (ECDHE) 來實現的。
為什麼我在某些網站上看到憑證錯誤?
憑證錯誤通常表示憑證已過期、自簽、為不同網域簽發,或憑證鏈不完整。瀏覽器拒絕此類憑證以保護您免受中間人攻擊。
當您需要檢查或除錯 TLS 連線時,Timestamp Converter 等工具可以幫助您解碼憑證有效期並除錯時間相關問題。