證書透明度
證書透明度 (Certificate Transparency) 是一個開放的框架,旨在防止和監控證書的錯誤簽發。透過證書透明度,新簽發的證書會被“記錄”到公開執行且通常獨立的CT日誌中——這些日誌維護著一個只可追加、經加密保證的已簽發 TLS 證書記錄。
透過這種方式,證書頒發機構 (CA) 可以受到更大的公眾審視和監督。潛在的惡意證書,例如違反 CA/B Forum基線要求的證書,可以被更快地檢測和撤銷。瀏覽器廠商和根證書庫維護者也能做出更明智的決定,關於他們可能決定不再信任的異常 CA。
Background
CT日誌建立在Merkle樹資料結構的基礎上。節點用其子節點的加密雜湊進行標記。葉節點包含實際資料塊的雜湊。因此,根節點的標籤取決於樹中所有其他節點。
在證書透明度的上下文中,葉節點雜湊的資料是當前執行的各種不同 CA 所簽發的證書。證書的包含可以透過審計證明進行驗證,該證明可以高效地生成和驗證,時間複雜度為對數 O(log n)。
證書透明度最初出現於 2013 年,背景是 CA 遭遇了多次安全事件(2011 年的 DigiNotar 洩露事件)、有爭議的決定(2012 年的 Trustwave 子根事件)以及技術簽發問題(馬來西亞 DigiCert Sdn Bhd 簽發弱的 512 位證書)。
實現
當證書提交到 CT 日誌時,會生成一個已簽名的證書時間戳 (SCT) 並返回。這作為證書已被提交併將被新增到日誌中的證明。
規範指出,符合要求的伺服器在與 TLS 客戶端連線時必須提供多個 SCT。這可以透過多種不同機制實現:
- X.509v3 證書擴充套件,將已簽名的證書時間戳直接嵌入到葉證書中
- 在握手過程中傳送的型別為
signed_certificate_timestamp的 TLS 擴充套件 - OCSP 釘扎(即
status_requestTLS 擴充套件),並提供一個帶有零個或多個 SCT 的SignedCertificateTimestampList
對於 X.509 證書擴充套件,包含的 SCT 由簽發 CA 決定。自 2021 年 6 月起,大多數積極使用且有效的公開受信任證書都在此擴充套件中嵌入了透明度資料。此方法不應需要修改 Web 伺服器。
對於後幾種方法,需要更新伺服器以傳送所需資料。優點是伺服器運營商可以自定義透過 TLS 擴充套件/釘扎的 OCSP 響應傳送的 SCT 的 CT 日誌源。
瀏覽器要求
Google Chrome 107 及更高版本要求對所有 notBefore 日期在 2018 年 4 月 30 日之後的證書包含 CT 日誌。使用者將無法訪問使用不符合要求的 TLS 證書的網站。Chrome 此前已要求對擴充套件驗證 (EV) 和 Symantec 簽發的證書包含 CT。
Apple 要求 Safari 和其他伺服器信任伺服器證書需要不同數量的 SCT。
Firefox 桌面版 135 版本起要求包含由 Mozilla 根證書頒發機構計劃中的證書頒發機構簽發的證書的 CT 日誌。Firefox for Android 目前不要求包含 CT 日誌。
規範
瀏覽器實現基於已廢棄的規範 RFC 6962: Certificate Transparency(2025 年 1 月)。當前規範是 RFC 9162: Certificate Transparency Version 2.0。