當瀏覽器連線到 HTTPS 站點時,它不會盲目信任證書。它會驗證一條信任鏈——從你的站點證書到預信任的根憑證授權機構(CA)的一系列相互關聯的證書。
三個層級
┌─────────────────────────────────┐
│ ROOT CA │ 预装在浏览器/操作系统中
│ (ISRG Root X1 for LE) │ 自签名,长有效期(20+ 年)
└───────────────┬─────────────────┘
│ signs
▼
┌─────────────────────────────────┐
│ INTERMEDIATE CA │ 由根 CA 签名
│ (Let's Encrypt R3/R10) │ 中等有效期(5-10 年)
└───────────────┬─────────────────┘
│ signs
▼
┌─────────────────────────────────┐
│ YOUR CERTIFICATE │ 由中间 CA 签名
│ (example.com) │ 短有效期(LE 为 90 天)
└─────────────────────────────────┘
根 CA —— 受瀏覽器和作業系統信任。儲存在裝置的證書儲存中。自簽名(沒有人為根 CA 簽名——它本身就是信任錨點)。根金鑰儲存在離線硬體安全模組中。
中間 CA —— 由根 CA 簽名。實際負責簽發終端證書。如果中間 CA 被入侵,只需吊銷它——根 CA 保持安全。
終端證書 —— 你的證書。由中間 CA 簽名。這是你的伺服器傳送給瀏覽器的證書。
驗證流程
當瀏覽器收到證書時:
- 讀取你的證書 —— 提取簽發者名稱
- 查詢中間 CA —— 從伺服器響應或瀏覽器快取中獲取
- 驗證中間 CA 簽名 —— 檢查它是否由受信任的根 CA 簽名
- 驗證你的證書籤名 —— 檢查它是否由中間 CA 簽名
- 檢查有效期 —— 兩張證書都沒有過期
- 檢查域名匹配 —— 證書的 SAN/CN 與 URL 匹配
- 檢查吊銷狀態 —— 證書未被吊銷(OCSP/CRL)
如果任何步驟失敗 → 瀏覽器顯示安全警告。
為什麼中間 CA 很重要
最常見的 SSL 錯誤是缺少中間證書。如果你的伺服器只傳送了你的證書而沒有中間證書,瀏覽器就無法構建信任鏈。
Nginx 需要 fullchain.pem(你的證書 + 中間證書合併):
ssl_certificate /etc/ssl/fullchain.pem; # cert + intermediate
Apache 使用單獨的檔案:
SSLCertificateFile /etc/ssl/cert.pem # your cert
SSLCertificateChainFile /etc/ssl/chain.pem # intermediate
GetHTTPS 同時提供 fullchain.pem 和單獨的 cert.pem + chain.pem 檔案,確保你擁有適配任何伺服器的正確格式。
Let’s Encrypt 的證書鏈
Let’s Encrypt 當前的信任鏈:
ISRG Root X1 (root, in all trust stores)
└── Let's Encrypt R10 (intermediate, signs your cert)
└── yourdomain.com (your certificate)
還有一條透過 IdenTrust 的 DST Root CA X3 的交叉簽名路徑以相容舊裝置,但對大多數場景已不再需要。
常見問題
如何修復”證書不受信任”錯誤?
幾乎總是:缺少中間證書。使用 fullchain.pem(Nginx)或新增 SSLCertificateChainFile chain.pem(Apache)。使用以下命令測試:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
查詢 “verify return:1”(正常)或 “verify return:0”(鏈有問題)。
能在瀏覽器中檢視證書鏈嗎?
可以。點選鎖頭圖示 → “證書”(或”連線是安全的” → “證書有效”)。你將看到鏈條:你的證書 → 中間 CA → 根 CA。
如果根 CA 被入侵會怎樣?
該根 CA 會透過瀏覽器/作業系統更新從信任儲存中移除。在該根 CA 下籤發的所有證書都變為不受信任。這極為罕見——根金鑰儲存在帶有物理訪問控制的離線硬體安全模組中。
為什麼 Let’s Encrypt 使用中間證書而不是直接用根 CA 簽名?
安全隔離。如果中間金鑰被入侵,只需吊銷它——根 CA 保持安全。根金鑰儲存在離線狀態,僅用於簽名中間證書。這是所有主要憑證授權機構的標準做法。
需要在伺服器上安裝根證書嗎?
不需要。根證書預裝在瀏覽器和作業系統中。你的伺服器只需傳送你的證書 + 中間證書。瀏覽器已經擁有根證書,用它來驗證信任鏈。
除錯證書鏈問題
生產環境中最常見的 SSL 錯誤是證書鏈不完整。以下是系統性的診斷方法:
步驟 1:檢查伺服器傳送的證書鏈
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null
檢視輸出:
Certificate chain
0 s:CN = example.com
i:C = US, O = Let's Encrypt, CN = R10
1 s:C = US, O = Let's Encrypt, CN = R10
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
---
Verify return code: 0 (ok)
- Depth 0 = 你的證書
- Depth 1 = 中間證書
- “Verify return code: 0 (ok)” = 鏈條完整
如果只看到 depth 0(沒有 depth 1),說明缺少中間證書。
步驟 2:修復證書鏈
Nginx: 使用 fullchain.pem(證書 + 中間證書合併):
ssl_certificate /etc/ssl/fullchain.pem; # NOT cert.pem
Apache: 顯式新增中間證書:
SSLCertificateChainFile /etc/ssl/chain.pem
如果丟失了 chain.pem: 從 letsencrypt.org/certificates 下載 Let’s Encrypt 的中間證書,或使用 GetHTTPS 重新簽發證書。
步驟 3:驗證修復結果
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | grep "Verify return code"
# Must say: Verify return code: 0 (ok)