HTTPS 與 TLS 實際運作原理:實用指南
你在瀏覽器中看過鎖頭圖示千百次,但你知道當你造訪一個 HTTPS 網站時,背後實際發生什麼事嗎?讓安全網頁瀏覽成為可能的協定是 TLS(傳輸層安全性),舊稱 SSL。了解 TLS 的實際運作不僅是學術探討——它能幫助你除錯設定問題、為自己的伺服器做出明智決策,並理解你每天依賴的安全保證。
問題:不安全的 HTTP
在 HTTPS 出現之前,HTTP 以明文傳送所有內容。網路路徑上的任何人——Wi-Fi 熱點、ISP、路由器——都能讀取你的密碼、Cookie 和個人資料。更糟的是,攻擊者可以在傳輸過程中修改內容,注入惡意軟體或假頁面。解決方案是加密資料並驗證伺服器身分。這正是 TLS 所做的事。
TLS 如何融入 HTTPS
HTTPS 只是 HTTP 在 TLS 連線上執行。TLS 協定位於應用層(HTTP)和傳輸層(TCP)之間。它提供三項核心服務:
- 加密 – 資料被攪亂,竊聽者無法讀取。
- 身分驗證 – 你可以透過數位憑證驗證伺服器是否如其所宣稱。
- 完整性 – 任何對資料的竄改都會被偵測。
但客戶端和伺服器如何協商加密金鑰並證明身分?這就是 TLS 握手 的工作。
TLS 握手逐步解說
當你造訪一個 HTTPS 網站時,你的瀏覽器和伺服器會執行握手——一系列建立安全工作階段的訊息。以下是現代 TLS 1.3 握手的簡化版本:
- ClientHello:客戶端發送訊息,列出支援的 TLS 版本、加密套件和一個隨機數。
- ServerHello:伺服器選擇一個加密套件並發送自己的隨機數。
- 伺服器憑證:伺服器發送其數位憑證,其中包含其公鑰和身分。
- 金鑰交換:使用伺服器的公鑰和類似 Diffie-Hellman 的技術,雙方計算出共享的祕密——工作階段金鑰。
- 完成:雙方發送加密訊息,確認一切就緒。從現在起,所有資料都以工作階段金鑰加密。
在 TLS 1.3 中,這只需一次來回,使連線比舊版更快。
憑證呢?
伺服器的憑證是由受信任的第三方——稱為 憑證頒發機構(CA)——發行的數位文件。它將公鑰綁定到網域名稱。你的瀏覽器會檢查憑證的有效性、到期日,以及是否由受信任的 CA 頒發。如果網域不符或憑證過期,你會看到警告。
要取得憑證,網站所有者使用 ACME 協定(通常搭配 Let's Encrypt 等工具)來證明他們控制該網域。CA 接著用自己的私鑰簽署憑證。這建立了從瀏覽器到 CA 再到網站的信賴鏈。
對稱加密 vs. 非對稱加密
TLS 使用兩種加密:
- 非對稱加密(公鑰/私鑰)在握手期間用於安全交換祕密,而無需預先共享金鑰。
- 對稱加密(加密和解密使用相同金鑰)用於實際資料傳輸,因為速度更快。
例如,RSA 常用於初始金鑰交換(雖然 TLS 1.3 偏好 Diffie-Hellman),而 AES-GCM 是大量資料的熱門對稱加密法。
加密套件:建構積木
加密套件是演算法的組合,定義握手和加密如何運作。例如,套件 TLS_AES_256_GCM_SHA384 代表:
- 金鑰交換:(在 TLS 1.3 中由套件隱含)
- 大量加密:AES 在 GCM 模式下使用 256 位元金鑰
- 完整性雜湊:SHA-384
設定伺服器時,你可以選擇啟用哪些加密套件。較舊的套件如 ECDHE-RSA-AES128-GCM-SHA256 仍然常見。目標是偏好提供前向保密的套件——意思是即使伺服器的私鑰日後被破解,過去的工作階段仍然安全。
以下是常見 TLS 版本的小比較:
| 版本 | 發布年份 | 主要特色 | 狀態 |
|---|---|---|---|
| TLS 1.2 | 2008 | SHA-256、AEAD 加密法 | 廣泛支援 |
| TLS 1.3 | 2018 | 更快的握手、僅前向保密加密法 | 建議使用 |
| TLS 1.0/1.1 | 1999/2006 | 舊版、弱 | 已淘汰 |
常見陷阱及如何避免
即使啟用了 TLS,錯誤仍可能危及安全:
- 混合內容:在 HTTPS 頁面上透過 HTTP 提供部分資源。瀏覽器會封鎖許多類型的混合內容。務必對所有子資源使用相對 URL 或 HTTPS。
- 過時的協定:啟用 TLS 1.0 或 1.1 會讓使用者暴露在攻擊之下。在伺服器上停用它們。
- 弱加密套件:有些舊套件使用 RC4 或 DES,容易被破解。使用具前向保密的現代套件。
- 憑證過期:過期的憑證會導致錯誤。使用 certbot 或你的提供者的自動續期功能來自動續期。
- 缺少 HSTS:HTTP 嚴格傳輸安全性告訴瀏覽器永遠使用 HTTPS,防止降級攻擊。加上
Strict-Transport-Security標頭。
要測試伺服器的 TLS 設定,你可以使用線上掃描器,例如 SSL Labs 的 SSL Server Test(與我們無關)。它們會為你的設定評分並指出弱點。
使用 OpenSSL 除錯 TLS
有時你需要查看線路上的實際情況。openssl 命令列工具是你的好幫手。例如,要查看伺服器的憑證:
openssl s_client -connect example.com:443 -showcerts
這會輸出憑證鏈和其他詳細資料。你也可以測試特定的 TLS 版本:
openssl s_client -tls1_2 -connect example.com:443
如果你在排除無法連線的客戶端問題,這會顯示伺服器支援哪些協定和加密法。
為什麼 TLS 對你的網站很重要
除了安全性之外,HTTPS 是搜尋引擎的排名信號,也是許多現代瀏覽器功能(如地理位置和 service worker)的必要條件。如果你還沒遷移,現在就做吧。Let's Encrypt 等工具讓它免費又簡單。
一旦你使用 HTTPS,也應該考慮使用工具檢查 Web 伺服器的日誌是否有異常。例如,如果你執行 Nginx 伺服器,分析存取日誌可以幫助你發現重複的失敗握手或可疑請求。我們的 Nginx 日誌分析器 可以幫助你快速解析和理解那些日誌。
常見問題
SSL 和 TLS 有什麼不同?
SSL(安全通訊端層)是 TLS 的前身。所有 SSL 版本都已淘汰且不安全。TLS 是現代協定,其中 TLS 1.2 和 1.3 是目前的標準。人們常說「SSL」但意指「TLS」,但技術上它們是不同的。
瀏覽器如何驗證憑證?
瀏覽器使用頒發 CA 的公鑰檢查憑證的數位簽章。它還會驗證憑證未過期、網域相符,以及 CA 在其受信任的根憑證儲存庫中。如果任何檢查失敗,瀏覽器會顯示警告。
什麼是前向保密?
前向保密(或完美前向保密)是 ECDHE 等金鑰交換方法的特性。它確保即使伺服器的長期私鑰日後被破解,也無法推導出過去的工作階段金鑰,因此記錄的流量保持機密。TLS 1.3 強制要求前向保密的加密套件。
結論
HTTPS 和 TLS 不是魔法——它們是密碼學和信任的精心設計組合。透過了解握手、憑證和加密套件,你可以為自己的專案做出更好的決策,並自信地排除問題。保持你的協定更新、使用強大的加密套件,並始終測試你的設定。
準備好將知識付諸實踐了嗎?如果你管理 Nginx 伺服器,試試我們的 Nginx 日誌分析器,看看誰在連線你的網站,並在日誌中發現潛在的安全問題。