證書透明化日誌工作原理
- 2019 年 11 月 1 日
- 筆記
概念
證書透明日誌使用特殊的加密演算法有助於證書和日誌的公共審查。這個特殊的加密演算法稱作默克哈希樹(Merkle hash tree) ,一種包含哈希葉和結點的簡單二叉樹(圖1)。葉子是已附加到日誌中的單個證書的哈希。節點是成對的子葉或成對的子節點的哈希。所有葉子和結點的根,即根哈希稱作默克樹哈希(Merkle tree hash)。當日誌伺服器對默克樹哈希(及其他資訊)簽名,稱為簽名樹頭(STH:signed tree head )。
定期地,可能一小時一次,日誌伺服器將新獲取到的證書追加到日誌中。通過新獲取到的證書創建單獨的默克樹哈希,該哈希和之前已在哈希樹中的舊默克樹哈希結合成新的默克樹哈希(圖2)。對新的默克樹哈希簽名創建新簽名樹頭。反反覆復的持續,之前提交到日誌中的所有證書形成了一個不斷增長的默克樹。
一致性證明和審計證明
因為這種構造方式,默克哈希樹讓日誌高效迅速的證明兩件事:
- 所有證書被一致性地附加到日誌中
- 特定的證書附加到日誌中
日誌通過提供兩個加密證明來支援:默克一致性證明和默克審計證明。
默克一致性證明
默克一致性證明驗證一條日誌的任意兩個版本是一致的:即,新版本包含舊版本的一切,換句話說,所有新條目緊跟在上個版本的條目後。如果證明日誌是一致的,意味著沒有過期的證書且插入到日誌中,日誌中沒有證書被修改,且日誌也沒有分支過。
為了演示默克一致性證明原理,假設要證明圖2和圖3中的日誌是一致的。第一步,需要證明舊默克樹哈希是新默克樹哈希的子集。然後再證明新默克樹哈希是舊默克樹哈希加上所有中間新附加證書的結點哈希。一致性證明是計算這兩者所需要的最少中間節點哈希集。
這種情形下,一致性證明由以下中間節點哈希組成:k
,l
和m
(見圖4)。用k
和m
創建舊默克樹哈希,因此證明舊樹存在且沒有被改變。然後用l
和k
創建n
,用n
和m
創建日誌新默克樹哈希。如果計算的默克樹哈希和日誌中的相匹配,則日誌是一致性的。
監視器和審計定期使用一致性證明來驗證日誌是否正常。因為監視器通常有和日誌中一樣的證書列表,可以自行計算一致性證明,且驗證日誌中的一致性。設計可以簡單的查詢日誌伺服器,得到任意兩個已簽名樹頭的一致性證明。
默克審計證明
默克審計證明可以驗證日誌中是否有特定的證書。這是一項重要的證明任務,因為證書透明模型需要的是所有TLS客戶端拒絕沒有在日誌中出現的證書。
為顯示默克審計證明的原理,假設要驗證d3
證書(d
葉子)已經附加到圖3中里的日誌中。默克審計證明是計算葉與樹根之間的所有節點所需的缺少節點哈希。如果根據審計路徑計算的根哈希和當前日誌中的默克樹哈希相匹配,則該葉子存在於樹中(或換句話說,日誌中存在該證書)。
這個例子中,默克審計證明包含以下節點哈希:c,i,n
(見圖5)。以為d
已知,則可以用c
計算出j
。然後用i
和j
計算出m
,再用n
和m
計算出該日誌的默克樹哈希。同理,如果要驗證證書d4
已經被附加到日誌中,日誌給你發送f, l, m
結點哈希的一致性證明。已知葉子哈希( e
),也就能用葉子哈希f
計算出結點哈希k
,然後用結點哈希l
計算出結點哈希n
,再用結點哈希m
和n
計算出日誌的默克樹哈希。
任何人都可以請求日誌的默克樹哈希,也能驗證某個證書是否存在日誌中。審計通常發送這些類型的請求到日誌中,以便為TLS客戶端驗證證書。如果默克審計證明沒有計算出和默克樹哈希相匹配的根哈希,則意味著日誌中不存在該證書。
使用證明
證明提供審計需要的加密數據。通知,審計了解日誌的很少資訊,但是儘管了解有限,證明能為審計驗證日誌的一致性和特定證書是否已附加到日誌中。
若沒有證明,審計可能訪問或回去所有的日誌記錄,以行使其職責。證明讓數據交換更高效,日誌和審計交換的數據量也少的多。舉個例子,包好1000萬個證書的日誌僅需要24個結點哈希一致性證明。如果日誌中增加到2000萬個證書,一致性證明的結點哈希數量才到25個。
證明對於監視器也很有用,儘管方式略有不同。監視器通常保存監控到的日誌副本,以便檢查日誌的每個證書,且注意特定的證書。如果監視器檢查監控到的特定日誌的一致性,可以自己計算出一致性證明,然後驗證日誌的一致性。同樣地,如果監視器總是需要特定的證書是否存在於日誌中,也可以自己計算出審計證明,然後用該證明驗證證書。