HTTPS 與 TLS 的實際運作原理:實用指南
你大概看過瀏覽器裡的鎖頭圖示,並假設這代表網站是安全的。但當你造訪一個 HTTPS 網址時,實際發生了什麼事?為什麼有些憑證會觸發警告?你又怎麼知道連線是否真的端到端加密?本指南以實用角度拆解 HTTPS 和 TLS,說明握手步驟、憑證如何驗證,以及如何使用命令列工具檢查真實連線。讀完後,你將足夠了解其運作機制,能夠除錯 TLS 問題,並為自己的網路安全做出明智決定。
HTTPS 究竟是什麼
HTTPS 是建立在 TLS(Transport Layer Security,傳輸層安全性)之上的 HTTP。TLS 提供三項保證:
- 機密性:資料經過加密,竊聽者無法讀取。
- 完整性:資料在傳輸過程中若被竄改,將被偵測到。
- 認證:你正在與擁有該網域的伺服器通訊,而非冒充者。
沒有 TLS 時,HTTP 會以純文字在網路上傳送所有內容——密碼、Cookie 和內容。TLS 將這些流量包裝在加密通道中。鎖頭圖示表示連線已加密且憑證有效,但這並不表示該網站值得信賴或在其他方面安全(例如,它仍可能存在漏洞)。
白話解釋 TLS 握手
在任何 HTTP 資料交換之前,客戶端和伺服器會執行 TLS 握手。具體步驟在 TLS 1.2 和 1.3 之間略有不同,但核心概念相同:協商演算法、驗證伺服器,並建立共享金鑰。以下是 TLS 1.3(現代預設)的簡化流程:
- Client Hello:客戶端傳送支援的加密套件清單、一個隨機值和金鑰共享(用於金鑰交換)。
- Server Hello:伺服器選擇一個加密套件,傳送自己的隨機值和金鑰共享,並提供其憑證鏈。
- 憑證驗證:客戶端檢查憑證的有效性、網域名稱和信任鏈。
- 金鑰衍生:雙方使用 Diffie-Hellman(通常是 X25519)計算出相同的共享密鑰。並由此衍生對稱會話金鑰。
- Finished:雙方對握手記錄傳送 MAC,以確認沒有任何內容被竄改。
握手完成後,應用程式資料(HTTP 請求和回應)便使用會話金鑰加密。TLS 1.3 將握手減少到一個往返(1-RTT),並支援 0-RTT 恢復,使其比 TLS 1.2 更快。
憑證驗證:瀏覽器如何決定信任網站
當伺服器傳送其憑證時,客戶端必須進行驗證。瀏覽器(或你的 HTTP 客戶端)會執行幾項檢查:
- 信任鏈:憑證必須由受信任的憑證授權單位(CA)簽署,或由可鏈結到客戶端信任儲存區中根 CA 的中間 CA 簽署。
- 網域名稱:憑證的主體別名(SAN)必須包含你正在連線的主機名稱。
- 有效期間:憑證不得過期或尚未生效。
- 撤銷狀態:客戶端可能會檢查 OCSP 或 CRL 以確認憑證是否被撤銷(儘管這通常是盡力而為)。
如果任何檢查失敗,瀏覽器會顯示警告。例如,自簽憑證會觸發「你的連線不是私人連線」,因為它並非由受信任的 CA 簽署。
檢查真實的 TLS 連線
你可以使用 OpenSSL 自行查看握手詳細資訊。在終端機中執行此命令(替換主機名稱):
openssl s_client -connect example.com:443 -servername example.com -showcerts
輸出會包含憑證鏈、協商的加密套件和 TLS 版本。尋找類似以下的行:
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
這表示連線使用 TLS 1.3 和 AES-256-GCM。你也可以使用 curl -v https://example.com 查看 TLS 握手摘要。
常見的 TLS 設定錯誤及如何發現
即使啟用了 HTTPS,設定錯誤仍可能削弱安全性。以下是一些常見問題:
| 問題 | 風險 | 如何檢查 |
|---|---|---|
| 弱協定(TLS 1.0/1.1) | 易受已知攻擊 | openssl s_client -tls1_1 -connect host:443 應該失敗 |
| 憑證過期 | 瀏覽器警告、信任中斷 | 使用 openssl s_client | openssl x509 -noout -dates 檢查到期日 |
| 缺少中間憑證 | 部分客戶端驗證失敗 | 使用 -showcerts 並驗證鏈的完整性 |
| 沒有 HSTS 標頭 | 可能遭受降級攻擊 | 檢查是否有 Strict-Transport-Security 標頭 |
修復這些問題通常涉及更新伺服器設定(例如,在 Nginx 中:ssl_protocols TLSv1.2 TLSv1.3;)並確保你的憑證鏈完整。
實務中的 HTTPS:開發者該做什麼
- 僅使用 TLS 1.2 或 1.3;停用較舊版本。
- 從受信任的 CA 取得憑證(Let's Encrypt 免費且自動化)。
- 啟用 HSTS 以強制使用 HTTPS。
- 定期更新憑證並監控到期日。
- 使用 SSL Labs(qualys.com/ssllabs)或
testssl.sh等工具測試你的設定。
如果你正在除錯伺服器日誌,Nginx 日誌分析器 可以幫助你從存取日誌中找出 TLS 握手失敗和憑證錯誤。
常見問題
TLS 和 SSL 有什麼區別?
SSL 是 TLS 的前身。SSL 2.0 和 3.0 已棄用且不安全;現代系統使用 TLS 1.2 或 1.3。人們口語上常說「SSL」,但他們指的是 TLS。
HTTPS 能讓網站完全安全嗎?
不能。HTTPS 加密流量並驗證伺服器,但它不能防止 SQL 注入、XSS 或權限設定錯誤等漏洞。它只是安全防護的一層。
如何檢查網站是否支援 TLS 1.3?
使用 openssl s_client -connect host:443 -tls1_3。如果握手成功,則支援 TLS 1.3。或者,在瀏覽器開發者工具的安全性標籤中檢查協定。
了解 TLS 握手和憑證驗證有助於你建置和維護安全的網路服務。當你需要分析伺服器日誌中的 TLS 錯誤或效能問題時,試試 Nginx 日誌分析器,快速解析和篩選日誌項目。