這起事件最奇怪的地方在於,憑證看起來一切正常。

它們有熟悉的 CA 名稱,也能鏈到受信任的根憑證。瀏覽器可以驗證它們。稽核週期照常來去。

但有 8 張 eMudhra 中繼憑證的私鑰出了嚴重問題,嚴重到不需要超級電腦、量子突破,或巧妙的密碼學攻擊。

只要數數字,就能把私鑰還原出來。

這就是 eMudhra CA 事件背後的故事。這不只是密碼學失效,也是營運失效、審查失效,以及事件處理失效。

目前公開資訊仍不完整。eMudhra 表示最終根因分析仍在進行中,因此本文會將已確認的事實,與公開報導中描述、較可能的失敗鏈分開說明。

簡短版

2025 年 4 月 30 日,一次金鑰生成儀式替 eMudhra 營運的 8 個中繼憑證授權單位產生了弱私鑰。

受影響的憑證使用的是橢圓曲線密碼學。安全的 P-384 私鑰應該是一個巨大的隨機數。據報導,受影響的數值小於 256。其中一個廣泛討論的例子,私鑰值是 4。

這不是「稍微弱一點」而已。這就像把本來應該有數百位隨機性的保險箱密碼鎖,變成了看起來只有 4 位數的組合鎖。

公開憑證中包含了對應的公鑰。任何人都可以拿公鑰嘗試那些很小的可能私鑰,並在不到 1 秒內還原出私鑰。

這些弱中繼憑證大約受公開信任了 18 個月。2026 年 10 月 17 日,一位研究人員向 Chrome Root Program 回報了這個問題。Chrome 和 Firefox 很快封鎖了受影響的憑證。eMudhra 也撤銷了這些中繼憑證,之後宣布提供客戶遷移支援。

目前沒有公開證據顯示這些弱金鑰在揭露前曾被利用。這是好訊息,但不代表事件本身就不嚴重。

Diagram showing how a weak intermediate CA key affects the certificate trust chain

先說,中繼 CA 到底在做什麼?

大多數人接觸憑證授權單位,都是在瀏覽器顯示鎖頭時。那個鎖頭背後,是一條信任鏈。

受信任的根 CA
      ↓ 簽署
中繼 CA
      ↓ 簽署
網站或程式碼簽署憑證
      ↓
瀏覽器、裝置或應用程式接受該憑證

根 CA 是高價值的信任錨點。瀏覽器和作業系統會把它保存在根憑證存放區中。根 CA 通常會受到嚴密保護,並簽署中繼 CA,而不是直接替每一張網站憑證簽章。

中繼 CA 則是日常的簽發者。它可以根據自己的限制,替網站、軟體發布者,以及其他用途簽發憑證。

這就是為什麼中繼私鑰如此重要。如果攻擊者拿到它,就可能建立看起來對信任該鏈條的軟體而言是合法的憑證。

這不是只攻破某一個網站而已,而是攻破了一台能讓許多網站或已簽章程式看起來可信的機器。

為什麼私鑰是「4」會完全改變一切

對橢圓曲線金鑰來說,公鑰是透過以下關係,由私鑰計算出來的:

Q = d × G

其中:

  • d 是私鑰
  • G 是曲線上公開、固定的基點
  • Q 是放在憑證中的公鑰

對正常的 P-384 金鑰來說,d 應該是具有約 384 位元熵的隨機值。橢圓曲線密碼學的重點在於:對一個正常的公鑰 Q,要倒推回 d 是不可行的。

但這個前提有條件:私鑰必須是又隨機又夠大。

如果 d 小於 256,攻擊者就不需要解什麼困難的數學問題。他們可以計算:

1 × G
2 × G
3 × G
4 × G
...
255 × G

然後把每個結果與憑證中的公鑰比對。只要比對成功,就能知道私鑰。

這就是這次失敗如此驚人的原因。不是密碼演算法突然變弱了,而是金鑰生成流程提供了一個小到讓演算法根本來不及提供安全性的私值。

公開報導指出到底哪裡出錯了

公開說法指向的是一連串疊加的失敗,而不是單一一次誤按按鈕。

根據 eMudhra 的聲明與公開事件討論:

  1. 這次儀式原本要替一組中繼憑證產生正確的 RSA-4096 與 P-384 金鑰對。
  2. 一項儀式偏離流程,引入了用於 HSM 金鑰處理的 wrap-and-unwrap 測試。
  3. 儀式腳本中的缺陷,另外產生了一組弱 EC 金鑰,與預期金鑰並存。
  4. 弱金鑰與強金鑰的標籤相似。
  5. 在建立憑證簽署請求時,選到了錯誤的金鑰物件。
  6. 產生的弱公鑰被簽入中繼 CA 憑證,並為相容性進行了交叉簽署。
  7. 強金鑰仍留在 HSM 上,但不是公開憑證所代表的金鑰。

確切根因目前尚未定案。這點很重要。假裝公開時間線已經告訴我們內部儀式、每次審查、每個決策的所有細節,是不對的。

但重要的失敗輪廓已經很清楚:

生成缺陷造出壞金鑰,接著在選擇與驗證失敗下把它們發布出去。

這兩種失敗單獨來看都可能被攔下來,但合在一起,就變成一場影響瀏覽器信任的事件。

原本應該立刻擋下整件事的警訊

公開說法中最令人不安的部分,不是最初的腳本錯誤,而是據報導幾週後發生的事。

大約在 2025 年 5 月,憑證撤銷清單簽章開始驗證失敗。

CRL 是一份已不應再被信任的憑證清單,而且是有簽章的。要讓簽章驗證通過,用來簽署 CRL 的私鑰必須與發行 CA 憑證中的公鑰相符。

如果這個檢查失敗,系統就在告訴你一件很具體的事:

簽署這份 CRL 的私鑰,
和這張 CA 憑證宣告的公鑰不一致。

對 CA 來說,這應該是一場事件,不是改個設定就關掉的工單。

公開報導指出,CRL 簽署者被重新配置為使用那組弱金鑰,之後簽章才驗證通過。這解除了當下的症狀,但沒有回答為什麼會有兩組不同的金鑰,也沒有回答為什麼公開憑證與預期的 HSM 簽署金鑰不一致。

這就是「讓警報停止」和「找出為什麼警報響了」之間的差別。

漏掉的 RCA,逐步來看

RCA 不是一句「配置了錯誤的金鑰」就能交代完的段落。真正有用的 RCA,會一直追問到失效的控制點,而不是停在最接近故障的人或設定。

下面是表層分析可能長得像什麼:

階段 表層答案
症狀 CRL 簽章驗證失敗
直接原因 簽署者用了錯的金鑰
修復 把簽署者指到另一把金鑰
狀態 結案

這不夠,因為它把額外金鑰的存在視為正常。

下面才是更深入、也更有用的追問方式:

問題 調查應該釐清的內容
為什麼 CRL 簽章失敗? 簽署用私鑰與中繼憑證中的公鑰不相符。
為什麼不相符? 憑證請求使用的金鑰對,和原本預期的 HSM 簽署金鑰不是同一組。
為什麼會有兩組金鑰對? 儀式在 wrap-and-unwrap 測試期間產生了額外的金鑰材料。
為什麼會選到錯的那一組? 標籤與選擇控制沒有讓預期金鑰變得明確無誤。
為什麼沒人在發證前發現不一致? 沒有獨立的事後對帳,去證明每一份憑證請求都對應到預期的 HSM 金鑰。

在第二個問題那一步,事件其實就已經可以被發現了。

有人可以比對憑證請求中的公鑰指紋與 HSM 物件的公鑰指紋;也可以檢查金鑰屬性;還可以對 EC 公鑰點做基本合理性檢查。

任何一種檢查,都可能把原本會變成整個生態系事件的問題,變成還在內部的重新儀式。

為什麼兩次稽核都沒抓到

很容易聽到「兩個稽核週期」就得出稽核沒用的結論,但這不是重點。

稽核通常是用來驗證已文件化的控制措施是否存在、是否有照做。它們可能見證儀式、抽查紀錄、審查核准、檢視程序,但不一定會重新計算每一把已生成密碼金鑰的安全性。

而這正是關鍵差距。

一場儀式可以有正確的人在場、正確的表單、正確的 HSM、以及檢查清單上的正確簽章,但最後仍然公開了一把災難性脆弱的金鑰。流程證據,不等於密碼學驗證。

對 CA 來說,驗證必須包含金鑰材料本身:

  • 憑證請求的公鑰是否透過指紋與預期的 HSM 金鑰相符?
  • 每一個預定的中繼憑證,是否只有一組已核准的金鑰對?
  • EC 公鑰是否通過小標量合理性檢查?
  • 所有產生的金鑰物件是否都能與儀式計畫對帳?
  • 是否有獨立工具驗證輸出,而不是讓儀式腳本自己驗證自己的成果?

相較於把一個根憑證從瀏覽器信任庫中移除,這些檢查的成本幾乎可以忽略不計。

為什麼撤銷還不夠

eMudhra 撤銷了受影響的中繼憑證,這是必要的,但不夠。

撤銷只有在用戶端會去抓撤銷資訊、而且決定強制檢查時才有效。有些用戶端會穩定這麼做;有些在網路錯誤時會軟失敗;有些根本不檢查。

瀏覽器還有額外機制。Chrome 和 Firefox 可以比等每個用戶端去下載並遵守 CRL 快得多的速度,推送緊急的不信任資訊。這也解釋了為什麼在回報後,受影響的中繼憑證能很快被封鎖。

但一把經由多條路徑被公開信任的 CA 金鑰,需要的不只是瀏覽器層級的處置。

受影響的中繼憑證也有位於 Sectigo AAA Certificate Services 底下的交叉簽署版本。交叉簽署的存在,是為了合理的相容性目標:舊裝置即使沒有較新的 eMudhra 根憑證,也可能信任那個交叉簽署根。

在這個案例裡,相容性變成了風險放大器。

同一把弱中繼金鑰
        ↙                    ↘
eMudhra 信任路徑        Sectigo 交叉簽署路徑

只封鎖 eMudhra 路徑,不一定能阻止用戶端透過另一條路徑接受鏈條。因此,瀏覽器也必須處理交叉簽署路徑。

不只瀏覽器要考慮

瀏覽器封鎖是可見而且快速的,但後端用戶端通常安靜得多。

命令列工具、內部服務、自訂手機 App、嵌入式裝置、Java 執行環境、私有信任存放區,以及使用釘選或過期 CA bundle 的應用程式,可能不會在同一時間線上收到同樣的緊急保護。

它們在憑證透明度與撤銷檢查上的行為,也可能不同。

對工程團隊來說,實務上的教訓很簡單:

不要因為信任鏈遷移造成連線失敗,就把憑證驗證關掉。

那會把相容性問題,變成安全繞過。

如果某個服務因為 CA 鏈不再受信任而壞掉,請正確更新該服務的憑證、信任存放區、用戶端函式庫或設定。臨時把 verify 關掉,是最容易變成下一次事件的權宜之計。

CA 在這之後應該改什麼

這裡真正值得關注的控制措施,其實不複雜。

1. 對儀式輸出做對帳

每次金鑰儀式之後,都要列出所有 HSM 金鑰物件,並與核准計畫比對。每個 CA 身分應該只會有一組預期金鑰對。多出來或非預期的金鑰物件,應該直接停止流程。

2. 用指紋選金鑰,不要只看友善名稱

名稱可能很像,操作員也可能看錯。跟儀式紀錄綁定的 SHA-256 指紋,要難混淆得多。

3. 獨立驗證公鑰

使用不同工具、不同審查者,確認憑證請求中的公鑰與核准的 HSM 物件一致。不能只有同一個儀式腳本在替自己的結果背書。

4. 在簽章前測試金鑰品質

對 EC 金鑰,檢查是否有明顯的小標量值。對 RSA 金鑰,進行適當的弱因數或共享因數檢查。CA 應該至少和檢查客戶憑證請求一樣嚴格地檢查自己的簽章金鑰。

5. 把無法解釋的密碼學失效視為事件

涉及 CA 金鑰的簽章驗證失敗,在結案前需要書面的根因、保存證據,以及獨立審查。不是「我們換了金鑰就好了」就算完,那只是調查的開始,不是結束。

6. 把儀式偏離流程視為安全變更

wrap-and-unwrap 測試聽起來範圍很小,但它碰到的是秘密金鑰處理,這讓它成為安全關鍵變更。它應該要有獨立審查、在非正式產線 HSM 上先做預演,以及不依賴被修改腳本的輸出檢查。

7. 重新檢查交叉簽署的中繼憑證

交叉簽署會改變誰能信任一把金鑰。每一條新的信任路徑,都應觸發同樣的金鑰品質驗證,並且明確回答:「如果出問題,我們要如何在所有地方封鎖這把金鑰?」

這對其他人意味著什麼

多數團隊不是 CA 營運者,但這些教訓仍然適用。

安全檢查是訊號,不是麻煩

如果完整性檢查失敗,不要在還沒理解不一致原因前,就改變驗證路徑讓它通過。最昂貴的事件,往往都是從某個人覺得「很煩」的警告開始。

你的自動化需要獨立檢查

自動化最擅長的是非常快地重複一個錯誤決策。當它用來建立憑證、金鑰、簽章、備份或存取控制時,請用獨立工具或控制平面驗證輸出。

了解你的信任依賴

每一個對外 HTTPS 用戶端都依賴憑證驗證。請先盤點哪些應用程式使用自訂信任存放區、釘選憑證、舊版 Java bundle、嵌入式韌體或特殊代理設定,不要等緊急狀況來逼你面對這個問題。

旋轉速度本身就是安全控制

快速輪替金鑰與憑證,不只是方便而已。它決定了一場信任事件會持續幾小時、幾天,還是幾個月。

目前仍未知的部分

還有一些重要的未解問題,而且在原始證據回答之前,值得先把它們保留為未定:

  • eMudhra 最終的根因分析與獨立專家審查
  • 儀式程式碼的確切缺陷,以及讓它通過的控制措施
  • 2025 年 5 月 CRL 簽章失敗的完整內部處理過程
  • 在瀏覽器保護之外,是否有任何用戶端族群接受了這些受影響金鑰建立的鏈條
  • 瀏覽器與作業系統信任存放區措施的最終範圍

目前公開報導指出,在揭露之前沒有已知的利用行為,而且 Chrome 回報,在它封鎖前,6 個受影響的 TLS 中繼憑證沒有留下已記錄的 TLS 憑證。這些事實降低了已知影響,但沒有降低從控制失效中學習的急迫性。

真正的標題

標題不是橢圓曲線密碼學失敗了。

真正的標題是:一套安全系統依賴多層信任,但這些層都沒有及早問出最簡單的問題:

「我們公開的公鑰,真的對應到我們本來要用的那把安全私鑰嗎?」

對 CA 而言,這個問題本來就不應該被跳過。

對其他所有人來說,這是個提醒:強密碼學只是從演算法開始而已。它能否存活或失效,取決於生成、標籤、驗證、審查、監控,以及團隊對第一個警訊究竟有多重視。

來源


原文出處:https://dev.to/varshithvhegde/the-most-embarrassing-private-key-in-web-pki-history-f9b


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
261
🥈
boluoji
📝5  
68
🥉
mike
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登