客戶端驗證HTTPS網站證書是否由受信任的根證書頒發機構(CA)簽發,是一個多步驟的過程,涉及證書鏈驗證、信任錨(Trust Anchor)檢查、域名匹配和吊銷狀態驗證等。以下是詳細的驗證流程:
1. 證書鏈的構成
服務器發送的證書通常是一個證書鏈,包含:
? 服務器證書:網站的公鑰證書(由中間CA簽發)。
? 中間CA證書:由根CA簽發的中間證書頒發機構(Intermediate CA)的證書。
? 根CA證書:根證書頒發機構的自簽名證書(通常不直接發送,而是預裝在客戶端系統中)。
示例:
網站證書(由 Intermediate CA 簽發)
→ Intermediate CA 證書(由 Root CA 簽發)
→ Root CA 證書(預裝在客戶端中,作為信任錨)
2. 驗證步驟
(1) 證書鏈完整性驗證
? 客戶端(瀏覽器/操作系統)從服務器接收證書鏈,逐級驗證簽名:
- 服務器證書:用中間CA的公鑰驗證其簽名。
- 中間CA證書:用根CA的公鑰驗證其簽名。
- 根CA證書:客戶端內置的根證書列表中是否存在該根CA?若存在,則信任鏈成立。
(2) 信任錨(Trust Anchor)檢查
? 客戶端內置的根證書列表(Trust Store)是驗證的核心:
? 操作系統或瀏覽器預裝根證書:如Windows的“受信任的根證書頒發機構”、macOS的鑰匙串訪問、Chrome/Firefox的內置CA列表。
? 根CA證書必須是自簽名的,且客戶端明確信任它(例如用戶手動安裝的例外情況除外)。
(3) 證書有效期驗證
? 檢查證書的生效日期和過期時間,確保當前時間在有效期內。
(4) 域名匹配
? 證書中的Subject Alternative Name (SAN) 或 Common Name (CN) 必須與訪問的域名一致(如 example.com
或 *.example.com
)。
(5) 吊銷狀態檢查
? 客戶端需檢查證書是否被CA提前吊銷:
? CRL(證書吊銷列表):下載CA發布的吊銷列表,檢查證書序列號是否在其中。
? OCSP(在線證書狀態協議):直接向CA的OCSP服務器發送請求,實時查詢證書狀態。
? OCSP Stapling:服務器定期從CA獲取OCSP響應并緩存,在TLS握手時直接發送給客戶端,避免客戶端直接查詢。
(6) 擴展用途驗證
? 檢查證書的擴展字段(如 Extended Usage
),確保證書類型適用于服務器身份認證(如 Server Authentication
)。
3. 受信任的根證書來源
客戶端信任的根證書由以下途徑維護:
-
操作系統內置:
? Windows:通過系統更新自動同步微軟的根證書計劃(Windows Root Certificate Program)。? macOS:鑰匙串訪問中預置的受信任根證書。
? Linux:發行版提供的根證書包(如
ca-certificates
包)。 -
瀏覽器內置:
? Chrome/Edge:使用操作系統的根證書庫。? Firefox:獨立維護自己的根證書列表(NSS數據庫)。
-
用戶手動導入:
? 用戶可手動添加根證書(例如企業內網的自簽名證書),但存在安全風險。
4. 驗證失敗的常見原因
? 證書鏈不完整:服務器未發送中間CA證書,導致客戶端無法構建完整信任鏈。
? 根證書未預裝:證書由私有CA簽發,但客戶端未信任該CA。
? 域名不匹配:證書中的域名與訪問的域名不一致。
? 證書過期:證書已超過有效期。
? 吊銷狀態異常:證書已被CA吊銷,且OCSP/CRL檢查失敗。
5. 示例:Let’s Encrypt 的證書驗證
- Let’s Encrypt 使用中間CA(如
ISRG Root X1
)簽發服務器證書。 - 客戶端檢查中間CA的簽名是否由根CA(如
DST Root CA X3
或ISRG Root X1
)簽發。 - 根CA是否在客戶端的信任列表中?如果是,則驗證成功。
6. 總結
客戶端驗證的核心邏輯是:
“服務器證書的簽發路徑必須最終鏈接到客戶端信任的根CA,且所有中間環節均合法有效。”
如果任一環節失敗(如證書鏈斷裂、域名不匹配、吊銷狀態異常),客戶端會提示安全警告(如“您的連接不是私密連接”)。