證書透明度 Certificate Transparency 與 Fork 一致性
我們來深入聊聊 證書透明度(Certificate Transparency, CT) 。這不僅僅是一個(gè)技術(shù)方案,更是一種設(shè)計(jì)哲學(xué),教我們?nèi)绾卧诔錆M猜忌的開放網(wǎng)絡(luò)環(huán)境中,用分布式的思路構(gòu)建信任。
信任的危機(jī):為什么需要證書透明度?
在 1995 年之前,互聯(lián)網(wǎng)上的中間人攻擊(Man-in-the-Middle, MITM)是個(gè)大問題。當(dāng)你訪問銀行網(wǎng)站時(shí),很可能會(huì)被一個(gè)偽裝的假服務(wù)器騙走密碼,因?yàn)槟銦o(wú)法確定你正在對(duì)話的到底是誰(shuí)。
為了解決這個(gè)問題,我們引入了 證書頒發(fā)機(jī)構(gòu)(Certificate Authority, CA) 和 SSL/TLS 證書體系。這個(gè)體系的核心思想很簡(jiǎn)單:
- 網(wǎng)站(比如
google.com
)生成一對(duì)公私鑰。 - 它把自己的域名和公鑰打包,找一個(gè)大家都信任的權(quán)威機(jī)構(gòu)(CA),讓它簽名。
- 這個(gè)簽了名的包,就是 證書(Certificate) 。
- 當(dāng)你的瀏覽器訪問
google.com
時(shí),服務(wù)器會(huì)出示這張證書。 - 你的瀏覽器內(nèi)置了一份它信任的 CA 列表。它會(huì)檢查證書的簽名,如果簽名來自這個(gè)列表中的某個(gè) CA,并且證書上的域名是
google.com
,瀏覽器就相信它連接的是真正的谷歌服務(wù)器。
這個(gè)模型在大多數(shù)時(shí)候都運(yùn)行良好,但它有一個(gè)致命的弱點(diǎn): 我們無(wú)條件地信任了 CA 。全球有上百個(gè) CA,只要其中任何一個(gè)被黑客攻破,或者內(nèi)部出現(xiàn)惡意行為,它就可以為任何域名簽發(fā)“合法”的證書。
想象一下,一個(gè)不知名的 CA 被黑了,攻擊者用它簽發(fā)了一張 your-bank.com
的證書。然后通過 DNS 欺騙等手段,把你引向一個(gè)假冒的銀行網(wǎng)站。你的瀏覽器會(huì)看到一張“有效”的證書,于是放心地建立了連接,你的密碼就這樣被盜了。你和銀行本身可能都對(duì)此毫不知情。
這就是 CT 要解決的核心問題:CA 簽發(fā)證書的過程是一個(gè)黑盒子,出了問題我們很難發(fā)現(xiàn)。CT 的目標(biāo)就是把這個(gè)黑盒子砸開,讓一切都公開、透明。
CT 的三大核心組件與工作流程
證書透明度(Certificate Transparency, CT)的本質(zhì),是構(gòu)建一個(gè)公開的、只能追加、不可篡改的 日志系統(tǒng)(Log) ,用來記錄全球所有簽發(fā)的 TLS 證書。它的核心理念不是 防止 壞證書的簽發(fā),而是確保一旦簽發(fā),就一定能被 發(fā)現(xiàn)。
為了實(shí)現(xiàn)這個(gè)目標(biāo),CT 系統(tǒng)主要由三個(gè)角色構(gòu)成:日志服務(wù)器、監(jiān)控器和審計(jì)器。
日志服務(wù)器 (Log Server)
這是 CT 的心臟。你可以把它想象成一個(gè)公開的賬本。
- 只能追加 (Append-only) :新的證書記錄只能添加到末尾,不能修改或刪除歷史記錄。
- 加密保證 (Cryptographically Assured) :內(nèi)部使用一種叫 默克爾樹(Merkle Tree) 的數(shù)據(jù)結(jié)構(gòu)來組織所有證書。這棵樹的樹根(root hash)是對(duì)整個(gè)日志內(nèi)容的一個(gè)緊湊、安全的摘要。有了它,我們可以非常高效地驗(yàn)證:
某張證書是否真的存在于日志中(這被稱為 包含證明 (Proof of Inclusion) )。
日志的任何兩個(gè)版本之間是否一致,即新版本是否是舊版本的純粹追加(這被稱為 一致性證明 (Consistency Proof) )。
全球有多個(gè)獨(dú)立的組織(比如 Google, Cloudflare)在運(yùn)行這樣的日志服務(wù)器。為了避免單點(diǎn)故障和惡意行為,一個(gè)證書通常會(huì)被同時(shí)提交到多個(gè)不同的日志中。
監(jiān)控器 (Monitor)
監(jiān)控器是一個(gè)獨(dú)立的監(jiān)察服務(wù)。它的任務(wù)很簡(jiǎn)單: 持續(xù)不斷地盯著所有已知的 CT 日志 ,下載所有新加入的證書,然后檢查里面有沒有可疑的東西。
比如,Google 公司會(huì)運(yùn)行一個(gè)監(jiān)控器,專門尋找所有為 *.google.com
簽發(fā)的證書。一旦發(fā)現(xiàn)一個(gè)不是自己申請(qǐng)的,或者是由一個(gè)意料之外的 CA 簽發(fā)的證書,Google 的安全團(tuán)隊(duì)就會(huì)立刻收到警報(bào)。同理,任何一個(gè)網(wǎng)站所有者都可以運(yùn)行自己的監(jiān)控器,守護(hù)自己的域名。
審計(jì)器 (Auditor)
審計(jì)器通常內(nèi)嵌在我們的 瀏覽器 中。它的作用是在我們?nèi)粘I暇W(wǎng)時(shí),驗(yàn)證服務(wù)器提供的證書是否符合 CT 的規(guī)范。
當(dāng)瀏覽器訪問一個(gè) HTTPS 網(wǎng)站并收到證書時(shí),它會(huì)檢查證書中是否包含一個(gè)或多個(gè) 簽名證書時(shí)間戳(Signed Certificate Timestamp, SCT) 。
SCT 是什么?當(dāng)一個(gè) CA 把證書提交給 CT 日志時(shí),日志服務(wù)器會(huì)返回一個(gè) SCT。這就像一張回執(zhí),是日志服務(wù)器對(duì) CA 的一個(gè) 承諾 :“我收到了這張證書,并保證會(huì)在規(guī)定時(shí)間內(nèi)(通常是 24 小時(shí))將它公開到我的日志里”。
瀏覽器(審計(jì)器)看到 SCT 后,會(huì)驗(yàn)證其簽名是否來自一個(gè)它信任的日志服務(wù)器。只要驗(yàn)證通過,瀏覽器就認(rèn)為這張證書是“公開可審計(jì)的”,即使它還沒來得及去日志里查詢,也愿意接受它。這個(gè)機(jī)制給了日志一個(gè)短暫的緩沖期來處理證書,同時(shí)保證了沒有證書可以“私下”使用而不留痕跡。
瀏覽器如何驗(yàn)證 SCT 簽名?
- 預(yù)置/更新的信任日志列表(Log List)
- 大多數(shù)主流瀏覽器(Chrome、Firefox、Safari 等)會(huì)內(nèi)置一個(gè)「信任的 CT 日志服務(wù)器公鑰」列表,也會(huì)定期通過瀏覽器自身的更新機(jī)制(類似瀏覽器更新或 CRL/OCSP 更新方式)來刷新這份列表。
- 數(shù)字簽名檢查
- 當(dāng)瀏覽器收到帶有 SCT 的 TLS 握手消息或證書時(shí),就已經(jīng)拿到了 SCT(內(nèi)含:證書的哈希、時(shí)間戳、日志標(biāo)識(shí)符等)和相應(yīng)的簽名。
- 瀏覽器在本地利用對(duì)應(yīng)日志服務(wù)器的公鑰,按照 CT 協(xié)議定義的結(jié)構(gòu)(通常是 ECDSA-over-P256 或 Ed25519 等)去驗(yàn)證這段簽名。
- 如果簽名校驗(yàn)通過,就證明這個(gè)日志服務(wù)器在給定的時(shí)間點(diǎn)「確實(shí)」收到過這份證書,并承諾會(huì)在其公開的 Merkle Tree 里追加它。
整個(gè)過程完全在本地完成,不需要瀏覽器再去詢問任何第三方服務(wù)器。
工作流程總結(jié)
- CA 準(zhǔn)備簽發(fā)一張證書。
- CA 將這張(預(yù))證書發(fā)送給多個(gè) CT 日志服務(wù)器。
- 每個(gè)日志服務(wù)器返回一個(gè) SCT。
- CA 將這些 SCT 嵌入最終的證書里(或者通過其他方式提供給服務(wù)器)。
- Web 服務(wù)器將帶有 SCT 的證書發(fā)送給來訪的瀏覽器。
- 瀏覽器(審計(jì)器)驗(yàn)證 SCT 的有效性,確認(rèn)這張證書的簽發(fā)行為是公開的。
- 與此同時(shí),域名所有者的監(jiān)控器正在掃描 CT 日志,一旦發(fā)現(xiàn)未經(jīng)授權(quán)的證書,就會(huì)發(fā)出警報(bào)。
通過這個(gè)流程,任何一張被瀏覽器接受的證書,都必然會(huì)被置于公眾的監(jiān)督之下。攻擊者即使騙過了一個(gè) CA,也無(wú)法阻止這張偽造的證書出現(xiàn)在公開日志中,從而被監(jiān)控器發(fā)現(xiàn)。
CT 的安全基石:分叉一致性與八卦協(xié)議
一個(gè)聰明的人可能會(huì)問:如果一個(gè)惡意的日志服務(wù)器和 CA 合謀,給我的瀏覽器看一個(gè)包含偽造證書的、特供版的日志,同時(shí)給監(jiān)控器看一個(gè)正常的、不含該證書的日志,這不就繞過整個(gè)體系了嗎?
這種行為被稱為 “equivocation” 或者 視圖分叉(View Forking) 。CT 的設(shè)計(jì)者早就考慮到了這一點(diǎn),并引入了一個(gè)強(qiáng)大的屬性: 分叉一致性(Fork Consistency) 。
簡(jiǎn)單來說,一個(gè)行為良好的 CT 日志(基于 Merkle Tree)必須保證,它的任何新狀態(tài)都是舊狀態(tài)的簡(jiǎn)單追加。如果你今天看到的日志樹根是 STH_new
,昨天看到的是 STH_old
,那么日志服務(wù)器必須能提供一個(gè)數(shù)學(xué)證明(一致性證明),來表明 STH_new
對(duì)應(yīng)的日志包含了 STH_old
的全部?jī)?nèi)容,并且只是在后面增加了一些新條目。
如果一個(gè)惡意日志想對(duì)你搞“特供版”,它就必須永遠(yuǎn)維護(hù)這個(gè)為你定制的分叉。比如,它今天給你看了包含偽造證書的日志版本 A,明天為了讓你相信日志還在正常增長(zhǎng),它必須給你看版本 A+,后天是 A++……它不能突然給你看一個(gè)和主干日志 B 合并后的版本,因?yàn)樗鼰o(wú)法提供從 A 到 B 的一致性證明。
這意味著,這個(gè)惡意日志必須為你一個(gè)人永遠(yuǎn)地維護(hù)一個(gè)獨(dú)特的、虛假的世界。這不僅成本高昂,而且非常脆弱。一旦你和別人交流一下你們各自看到的日志樹根(STH),或者你的瀏覽器緩存了舊的 STH,然后訪問網(wǎng)絡(luò)時(shí)發(fā)現(xiàn)新的 STH 與舊的不一致且無(wú)法提供證明,欺騙行為就會(huì)立刻敗露。
為了讓這種“交流日志樹根”的行為系統(tǒng)化,CT 的原始設(shè)計(jì)中還包含了一個(gè) 八卦協(xié)議(Gossip Protocol) 。瀏覽器和監(jiān)控器之間可以互相交換它們看到的 STH,一旦發(fā)現(xiàn)不一致,就意味著某個(gè)日志服務(wù)器在作惡。盡管在當(dāng)前的實(shí)際部署中,gossip
協(xié)議并未被廣泛實(shí)現(xiàn),但利用這一點(diǎn)來作惡的攻擊“非常笨拙且風(fēng)險(xiǎn)極高”,所以系統(tǒng)在缺少它的情況下依然相當(dāng)安全。
常見問題與生產(chǎn)啟示
監(jiān)控器 (Monitor) 和審計(jì)器 (Auditor) 有什么區(qū)別?
這是理解 CT 的關(guān)鍵。
- 審計(jì)器 (Auditor) :在你的 瀏覽器 里。它只關(guān)心 當(dāng)前 遇到的這一張證書。它通過檢查 SCT 來確認(rèn)這張證書“已登記”,但它不關(guān)心日志里的其他證書。它的檢查是 被動(dòng)的、個(gè)例的 。
- 監(jiān)控器 (Monitor) :是一個(gè) 獨(dú)立的服務(wù) 。它關(guān)心的是 所有 的證書。它會(huì)完整地拉取日志,主動(dòng)地、地毯式地搜索它關(guān)心的域名(比如
*.mit.edu
),檢查每一張相關(guān)證書的合法性。它的檢查是 主動(dòng)的、全局的 。
為什么需要多個(gè)獨(dú)立的日志服務(wù)器?
為了 去中心化 和 容錯(cuò) 。如果只有一個(gè)日志,它一旦宕機(jī),所有 CA 都無(wú)法簽發(fā)被瀏覽器接受的證書。如果它變壞了,整個(gè)系統(tǒng)就失去了意義。通過要求證書出現(xiàn)在多個(gè)獨(dú)立的日志中,CT 大大提高了系統(tǒng)的健壯性和抗審查性。
CT 有什么啟示?
- 信任模型 :CT 是一個(gè)典型的從“相信權(quán)威”轉(zhuǎn)變?yōu)椤斑^程可審計(jì)”的范例。在設(shè)計(jì)需要多方協(xié)作的分布式系統(tǒng)時(shí),這是一個(gè)非常重要的思想。與其假設(shè)每個(gè)參與者都是好人,不如設(shè)計(jì)一個(gè)機(jī)制,讓每個(gè)人的行為都公開透明,作惡行為能被輕易發(fā)現(xiàn)。這正是區(qū)塊鏈等技術(shù)的核心思想之一。
- 審計(jì)優(yōu)于預(yù)防 :在很多場(chǎng)景下,完全 預(yù)防 問題的發(fā)生是不可能或成本極高的。CT 提供了一個(gè)B計(jì)劃:即使無(wú)法阻止壞證書被簽發(fā),我們也能確保它被 發(fā)現(xiàn) 。這種“檢測(cè)與響應(yīng)”的設(shè)計(jì)思路在安全、運(yùn)維等領(lǐng)域非常普遍。
- 數(shù)據(jù)結(jié)構(gòu)的力量 :Merkle Tree 在這里起到了定海神針的作用。它用很小的成本(一個(gè)樹根哈希值)實(shí)現(xiàn)了對(duì)海量數(shù)據(jù)的完整性校驗(yàn),并提供了高效的包含/一致性證明。理解其原理對(duì)于設(shè)計(jì)需要數(shù)據(jù)校驗(yàn)和同步的系統(tǒng)大有裨益。
- 隱私問題 :CT 也不是完美的。比如隱私問題:如果瀏覽器為了獲取“包含證明”而頻繁向日志服務(wù)器查詢某個(gè)證書,這可能會(huì)暴露用戶的瀏覽歷史。這是一個(gè)開放性問題,業(yè)界也在探索如私有信息檢索(Private Information Retrieval, PIR)等技術(shù)來緩解它。
總結(jié)
CT 的核心貢獻(xiàn)在于,它巧妙地利用 強(qiáng)制公開 和 可審計(jì)性 ,為一個(gè)原本封閉、基于絕對(duì)信任的系統(tǒng)(CA 體系)打上了一個(gè)透明的補(bǔ)丁。它并沒有推翻原有的體系,而是通過增加日志、監(jiān)控和審計(jì)這三個(gè)角色,讓所有參與者(CA、網(wǎng)站主、用戶)互相監(jiān)督,形成了一種新的制衡。
它的關(guān)鍵屬性是保證了盡管存在惡意,但每個(gè)人看到的都是同一份日志 (everyone sees the same log, despite malice) 。這種一致性,正是我們?cè)跇?gòu)建大型分布式系統(tǒng)時(shí)所追求的終極目標(biāo)之一。