在公開金鑰加密中,你如何驗證某把公鑰的擁有者身分?光是金鑰附帶一個宣稱的身分(比方說「倫敦的 Bob Smith」),並不代表它真的來自那個人。

如果我設法讓你相信「我的公鑰」屬於 Bob,那麼你加密給 Bob 的一切都只有我能讀取——因為我才是持有對應私鑰的人。

為緩解這個威脅,你需要建立公開金鑰基礎建設(Public Key Infrastructure, PKI):管理網路上非對稱公鑰資訊所用的協定、金鑰格式、使用者角色與政策的集合。

其中一種模型是信任網(web of trust, WOT),被 PGP 等應用採用:公鑰的身分由你信任的人(或許是你親自見過的人)背書。

WOT 在電子郵件情境運作良好(你多半知道通訊對象是誰),但對自動化的網路應用與商業流程就不太適用。

X.509 憑證#

當 WOT 不敷使用時,常改用更集中的信任模型,例如 X.509 憑證:它建立嚴格的信任階層,而非直接信任對等節點。X.509 憑證用於驗證 Web 伺服器、簽署可執行程式或向網路服務進行身分驗證,信任透過 RSA、DSA 等非對稱簽章演算法構成的憑證階層來提供。

有效憑證至少須包含四項資訊:

  • 主體(subject):憑證所指定的身分。
  • 主體的公鑰
  • 簽發者(issuer):辨識簽署此憑證的憑證。
  • 有效簽章:由簽發者的私鑰對整份憑證所做的認證簽章。

這些要求在憑證之間形成信任鏈(chain of trust)。因為傳播的只有公鑰資訊,可以安全地透過公開網路把各層憑證提供給使用者。

圖表 7-17:X.509 憑證的信任鏈

階層通常不只一層——根憑證簽發者直接簽署應用憑證並不尋常。根憑證由憑證授權單位(certificate authority, CA)簽發,可能是公開組織/公司(如 Verisign),也可能是為內部網路簽發憑證的私有實體。CA 的職責是驗證領證者的身分。根憑證無法由其他憑證簽署,而是自簽(self-signed):用憑證公鑰對應的私鑰為自己簽名。

CA 實際做多少查核並不總是清楚。有些 CA 更在意賣出簽署憑證,而非善盡職責,可能只檢查是否簽發給一個已註冊的營業地址。盡責的 CA 至少應拒絕在請求並非來自本尊時,為 Microsoft、Google 等知名公司簽發憑證。

驗證憑證鏈#

驗證一份憑證時,你沿著簽發鏈一路回溯到根憑證,並在每一步確認每份憑證都有有效且未過期的簽章。到達根憑證後,你決定是否信任它——以及是否因此信任鏈末端憑證所宣稱的身分。處理憑證的應用(如瀏覽器與作業系統)都有一個受信任的根憑證資料庫。

是什麼阻止一個拿到 Web 伺服器憑證的人,用該伺服器的私鑰簽署自己的偽造憑證?從密碼學角度看,一把私鑰與另一把並無不同。若信任僅奠基於金鑰鏈,偽造憑證會回溯到受信任的根,看起來完全合法。

X.509 規格提供三種機制來收緊這種攻擊面:

圖表 7-18:X.509 憑證的基本限制

機制作用
基本限制(basic constraints)一個旗標,指示憑證是否可用來簽署其他憑證、充當 CA。若某憑證的 CA 旗標為 false(或缺少此參數),一旦它被用來簽署另一份憑證,鏈的驗證就應失敗。
金鑰用途(key usage)指示憑證被產生用於哪些用途。若憑證被用於非其設計認證的用途(例如替 Web 伺服器簽發的憑證卻拿去簽署應用程式碼),驗證鏈就應失敗。
憑證撤銷清單(certificate revocation list, CRL)當私鑰遭竊或 CA 誤發憑證時,即使憑證的到期日還很遠,CA 也可將其列入 CRL。鏈中任一憑證若出現在撤銷清單上,驗證流程就應失敗。

由上可見,憑證鏈的驗證可能在許多環節失敗。分析協定安全時,這些正是值得逐一檢查的弱點所在。