公鑰密碼學(也稱非對稱密碼學)是 SSL/TLS 的基礎。它使用一對數學相關的金鑰——一個公鑰、一個私鑰——來加密資料、驗證身份和建立安全連線。每個 HTTPS 連線都依賴於它。
金鑰對概念
| 公鑰 | 私鑰 | |
|---|---|---|
| 誰擁有 | 所有人(包含在證書中) | 僅伺服器所有者 |
| 能加密 | ✅ | ✅ |
| 能解密 | 僅限私鑰加密的內容 | 僅限公鑰加密的內容 |
| 能否共享? | 是——這正是其目的 | 永遠不能 |
核心原理:用公鑰加密的資料只能用匹配的私鑰解密。反之亦然。兩個金鑰在數學上相關聯,但無法從公鑰推匯出私鑰。
在 SSL/TLS 中的應用
公鑰密碼學在每個 HTTPS 連線中服務於三個目的:
1. 金鑰交換——建立共享金鑰
在 TLS 握手過程中,伺服器和瀏覽器需要協商一個用於加密流量的共享會話金鑰。它們不能以明文傳送這個金鑰——可能被截獲。
解決方案:Diffie-Hellman 金鑰交換(現代 TLS 中具體為 ECDHE)。雙方各自貢獻隨機值,數學原理使它們能計算出相同的共享金鑰而無需傳輸。伺服器的私鑰對其貢獻進行簽名,證明伺服器身份。
2. 身份認證——證明身份
伺服器的 SSL 證書包含其公鑰。證書由憑證授權機構簽名。在握手過程中,伺服器證明它持有匹配的私鑰,從而證明伺服器確實是證書所宣告的身份。
沒有這一步,任何人都可以聲稱自己是 google.com。
3. 數字簽名——證明資料完整性
私鑰可以建立數字簽名——一個數學證明,表明特定資料由金鑰持有者簽名且未被修改。TLS 握手訊息被簽名以防止篡改。
對稱加密 vs 非對稱加密
| 非對稱(公鑰) | 對稱(會話金鑰) | |
|---|---|---|
| 金鑰 | 兩個(公鑰 + 私鑰) | 一個(共享金鑰) |
| 速度 | 慢(約慢 1000 倍) | 快 |
| 用途 | 金鑰交換 + 認證 | 加密實際資料 |
| 演算法 | RSA、ECDSA、ECDHE | AES-GCM、ChaCha20 |
| 在 TLS 中 | 僅握手階段 | 握手後(所有流量) |
HTTPS 同時使用兩者:非對稱加密用於握手(證明身份、交換金鑰),然後對稱加密用於實際資料傳輸(因為快得多)。
SSL 背後的演算法
RSA
仍在使用的最古老的公鑰演算法(1977 年)。基於大素數分解的困難性。可用於簽名和金鑰交換,但不使用 Diffie-Hellman 的 RSA 金鑰交換不提供前向保密,已從 TLS 1.3 中移除。
ECDSA(橢圓曲線數字簽名演算法)
使用橢圓曲線數學的現代簽名演算法。256 位 ECC 金鑰提供等同於 3072 位 RSA 金鑰的安全性——更小的金鑰、更快的簽名。GetHTTPS 預設使用 ECDSA P-256。
ECDHE(臨時橢圓曲線 Diffie-Hellman)
現代 TLS 中使用的金鑰交換機制。“臨時”意味著每個連線都生成新的金鑰對——提供前向保密。在 TLS 1.2 和 1.3 中均使用。
AES-GCM
握手後用於加密實際流量的對稱加密演算法。AES(高階加密標準)配合 GCM(Galois/Counter 模式)同時提供加密和認證。透過 AES-NI 指令在現代 CPU 上硬體加速。
GetHTTPS 如何使用公鑰密碼學
當你使用 GetHTTPS 時:
- 你的瀏覽器使用 Web Crypto API 生成一個金鑰對——與 TLS 本身使用的相同密碼學原語
- 公鑰放入傳送給 Let’s Encrypt 的 CSR 中
- 私鑰留在你的瀏覽器記憶體中——從不傳輸
- Let’s Encrypt 簽名公鑰並返回你的證書
- 你下載證書(公開)和私鑰到你的伺服器
私鑰僅存在於瀏覽器記憶體中,這就是為什麼 GetHTTPS 比在遠端伺服器上生成金鑰的工具更具隱私性。
常見問題
量子計算機能破解公鑰密碼學嗎?
當前的量子計算機不能。但足夠強大的量子計算機執行 Shor 演算法可以破解 RSA 和 ECC。行業正在用後量子密碼學做準備——新演算法(ML-KEM、ML-DSA)可抵抗量子攻擊。TLS 將以混合模式(經典 + 後量子)採用這些演算法,不會改變證書的工作方式。
為什麼不直接用非對稱加密處理所有資料?
速度。非對稱操作比對稱慢約 1000 倍。用 RSA 加密整個網頁是不切實際的。因此,TLS 僅在握手時使用非對稱加密(約 1ms),然後切換到對稱加密(AES)處理資料——以硬體速度執行。
256 位 ECC 金鑰真的足夠安全嗎?
256 位 ECC 提供約 128 位安全性——意味著攻擊者需要大約 2^128 次操作才能破解。這比可觀測宇宙中的原子數還多。在可預見的未來(不考慮量子計算機,那需要完全不同的演算法)是安全的。
加密和簽名有什麼區別?
加密: 保護機密性。用接收方的公鑰加密 → 只有其私鑰能解密。 簽名: 證明真實性。用你的私鑰簽名 → 任何擁有你公鑰的人都可以驗證它來自你且未被修改。TLS 證書使用簽名;TLS 資料傳輸使用加密。