所有 SSL 文章 SSL 與憑證

證書信任鏈詳解

當瀏覽器連線到 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 簽名。這是你的伺服器傳送給瀏覽器的證書。

驗證流程

當瀏覽器收到證書時:

  1. 讀取你的證書 —— 提取簽發者名稱
  2. 查詢中間 CA —— 從伺服器響應或瀏覽器快取中獲取
  3. 驗證中間 CA 簽名 —— 檢查它是否由受信任的根 CA 簽名
  4. 驗證你的證書籤名 —— 檢查它是否由中間 CA 簽名
  5. 檢查有效期 —— 兩張證書都沒有過期
  6. 檢查域名匹配 —— 證書的 SAN/CN 與 URL 匹配
  7. 檢查吊銷狀態 —— 證書未被吊銷(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.pemletsencrypt.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)

相關文章

SSL 與憑證 2026-05-07
SSL/TLS 如何工作:TLS 握手詳解
TLS 握手的視覺化解析——瀏覽器和伺服器如何在毫秒內建立加密連線。涵蓋 TLS 1.2、TLS 1.3、會話恢復和前向保密。
SSL 與憑證 2026-05-07
SSL 證書型別詳解:DV、OV 和 EV
對比域名驗證(DV)、組織驗證(OV)和擴充套件驗證(EV)SSL 證書。瞭解驗證方式、費用的差異,以及何時真正需要每種型別。
部署 2026-05-08
如何在 Nginx 上安裝 SSL 證書
在 Nginx 上安裝 SSL 證書的分步指南。涵蓋檔案上傳、完整 server 塊配置、TLS 最佳實踐、HTTP/2、HSTS、重新導向設定、測試以及 6 個常見錯誤的排查方法。
在瀏覽器中取得免費 SSL 憑證
無需安裝,無需帳號。私鑰始終留在你的裝置上。
取得憑證