去年中華電信,今年 TWCA:中繼憑證 11 月 6 日廢止前該檢查什麼

去年中華電信那次,使用 Chrome Root Store 的 Chrome 從 139 版起,不再預設信任鏈結至它兩個指定根、最早 SCT 落在 2025 年 7 月 31 日(UTC)之後的 TLS 伺服器憑證。今年 TWCA 也公告換證:原中繼憑證要在 2026 年 11 月 6 日 00:00 前廢止,客戶憑證改由新中繼重簽,金鑰對沿用,收到就裝,記得帶完整鏈。換證 SOP 得備妥。

兩次公告的處置不同。中華電信那次是 Chrome 根憑證計畫的決定,以最早 SCT 是否落在 2025 年 7 月 31 日(UTC)之後為界,較早的憑證不受這項變更影響。TWCA 這次是 CA 自己公告換中繼,截至查核時點,查閱的三個 bug 未見 Mozilla 或 Chrome 針對這些事件的處置決定。該做的是:期限前找到 TLS 終止的位置,換上新憑證與完整鏈,再從外面看伺服器實際送出什麼。

公告中文寫「廢止」,同頁英文版寫「must be revoked」,照撤銷準備比較穩。公告沒寫 00:00 的時區,沒列中繼名稱與指紋,也沒說終端憑證會不會撤銷、新中繼有沒有換金鑰。同一週另有序號熵不足與 RA 未授權存取兩類公開紀錄,公開來源尚未確認三件事之間的因果關係,下文分開寫。資料在 2026 年 11 月 2 日 20:44 初查並實測,22:12 重新核對過來源(台北時間)。

時間線

  • 2026-10-29 08:07 UTC:TWCA 自行通報 Bugzilla 2086949,RA 伺服器有未授權存取跡象。
  • 2026-10-29 19:31 UTC:外部研究者開立 2087236,指出 CA 憑證序號的隨機位元不足。回報正文的時間線寫 10 月 30 日,這裡以系統紀錄為準。
  • 2026-10-31:TWCA 發布 SSL 換證公告。
  • 2026-11-02 00:16 UTC:2087918 指出終端憑證序號另有熵不足的問題,TWCA 在 04:08 UTC 回覆,完整報告併入 2087236。
  • 2026-11-06 00:00(時區未載明):原中繼廢止期限。
  • 2026-11-12 19:00 UTC:TWCA 承諾交出完整事件報告的期限。

維運的幾個疑問

換證要排程,排程要有時間和名單,這兩樣公告剛好都沒給。TWCA 的股東陣容是臺灣證券交易所、臺灣集中保管結算所、財金資訊與網際威信。公告日期 10 月 31 日與期限 11 月 6 日相隔六個日曆日,00:00 沒寫時區,也沒有中繼名單與指紋。中文寫「廢止」、英文寫 revoked,應按撤銷準備。公告能不能補上時區與中繼資料,讓維運排得出時程?

這些都是看得到的落差,內部怎麼排程、為什麼這樣寫,公開資料沒有交代,本文不猜。11 月 12 日承諾提交的是序號事件完整報告,能否釐清換證公告的缺口仍未知,維運應先在公告期限前把鏈換好。

三類公開紀錄

換證公告

原因寫「因應國際規範要求調整中繼憑證規格」,並說依 CA/Browser Forum 規範。客戶憑證以新中繼重簽,沿用原金鑰對,安裝時要含完整鏈。公告沒有中繼名單、指紋、終端撤銷安排、瀏覽器影響與收費資訊。客服是 02-2370-8886 分機 9,SSL 銷售專線是 0800-002-666。範圍只到它寫的 SSL 客戶憑證,其他產品本文不外推。

2087236:CA 憑證序號

由 Prasanth Sundararajan 開立,和 Dr. Angelique Faye Loe 共同署名。回報者拆出的序號結構是:開頭 1 byte、notBefore 日期、補零、2 bytes 計數器、3 bytes 隨機,看起來隨機的最多 24 bits,BR(CA/Browser Forum TLS Baseline Requirements)要求至少 64 bits 來自 CSPRNG。他們檢查 TWCA 公開信任根簽出的 24 張 CA 憑證(2011-06-10 至 2024-09-06),其中 18 張在 2016-09-30 之後:回報者認為 11 張適用 TLS BR(回報當時 10 張未撤銷,1 張已於 2023-08-17 撤銷),2 張是自簽根 TWCA CYBER Root CA 與 TWCA Global Root CA G2,其餘 5 張未主張適用。

回報當時未撤銷的 TLS 簽發中繼有 6 張,指紋在 bug 內的 crt.sh 連結:

  • TWCA SSL Certification Authority,由 CYBER Root 簽,2023-02-23、2024-09-06 各一張。
  • TWCA EVSSL Certification Authority,由 CYBER Root 簽,2023-02-23、2024-09-06 各一張。
  • TWCA Secure SSL Certification Authority,由 Global Root 簽,2023-08-18、2023-10-16 各一張。

這是回報者整理的清單,公告沒列廢止名單,兩邊無法對照。他們當時抽查 29 份 CRL 裡 1,631 個終端序號,沒看到問題,後來的 2087918 補的正是終端這塊。回報者寫「We have no evidence of key compromise, certificate misuse or any exploitation.」與「A short serial number does not by itself allow forgery with SHA-256 signatures.」,並認為 BR 4.9.1.2 與 4.9.5「may apply」。TWCA 在 Comment 3 表示已知悉、調查中,承諾 2026 年 11 月 12 日 19:00 UTC 前交完整報告,Root cause 等欄位目前仍是「For TWCA to complete」。

2087918:終端憑證序號

Daniel C 分析 2025 年 CT log 約 1,600 張憑證,加上少量近期未到期的樣本。依 TWCA 先前的說明,序號最後 8 bytes 應含 64 bits 的 HSM CSPRNG 輸出,樣本的最高位元卻一直是 0,最高 byte 落在 0x00 到 0x7F。涉及的簽發 CA 有 TWCA EVSSL Certification Authority、TWCA Global EVSSL Certification Authority、TWCA Secure SSL Certification Authority、TWCA SSL Certification Authority,受影響張數未知。TWCA 回覆「Both incidents involve insufficient serial number entropy.」,報告併入 2087236。

2086949:RA 伺服器

TWCA 自行通報,狀態 ASSIGNED。資安監控發現 RA 伺服器有未授權存取跡象,已隔離、調查中,通報寫「No certificate mis-issuance has been identified to date.」。目前只有初步報告,範圍、成因,以及和序號問題有沒有關係,都還沒有資料。

截至 22:12,三個 bug 上都沒有 Mozilla 或 Chrome 根憑證計畫的處置決定,也沒找到相關撤信公告。這是查閱當下的結果,不代表信任會一直維持。

序號為什麼要隨機

BR v2.3.1 規定 serialNumber 必須是大於 0、小於 2 的 159 次方的非循序號碼,至少含 64 bits 的 CSPRNG 輸出。2016 年的 Ballot 164 寫了理由:隨機位元能降低雜湊碰撞攻擊的可行性。2008 年的 MD5 偽造 CA 研究,就是先預測序號與有效期間,再配合 MD5 碰撞做出來的。這段只是背景,不能當成本次事件已有相同攻擊的證據。

序號長度和隨機位元數要分開看。2087236 描述的 CA 序號像彩券號碼先印開獎日,最後才搖幾位,整串很長,真正在抽的只有尾巴 3 bytes。2087918 的終端樣本則是最後 8 bytes 的最高位元固定為 0,可能值至多 2 的 63 次方,不足以支持「64 bits CSPRNG 輸出」的說法。兩件都算熵不足,缺口大小差很多。

熵不足違反 BR,但不等於私鑰外洩、憑證遭濫用,或有人能做出通過 SHA-256 驗證的假憑證。回報者說沒有利用跡象,TWCA 說 RA 事件尚未發現錯誤簽發,兩句各屬各的文件,拼不出「所以沒事」,也拼不出「所以被利用了」。

四種讓連線失敗的情況

情況發生什麼事這次看得到的
到期時間超過 notAfter實測的終端到 2027-03-06,中繼到 2030-08-23
撤銷用戶端查到路徑上的憑證已撤銷,拒絕該路徑英文公告寫原中繼須撤銷,沒說終端會不會撤銷
移除根信任根憑證計畫拿掉某個根,路徑失去信任錨三個 bug 未見 Mozilla 或 Chrome 針對這些事件的處置決定
沒送完整鏈伺服器少送中繼,用戶端組不出路徑公告要求安裝完整鏈,憑證本身仍有效

中繼像轉介信:用戶端認識的是根那家機構,終端憑證是員工證,中繼負責把兩者接起來。信沒附上,櫃台對不上人;信過期、信被收回、機構被除名,是另外三種情況,修法各不相同。

中繼撤銷後,用戶端若查得該狀態,經過它的驗證路徑就會失敗,終端自己沒撤銷、還沒到期也一樣,所以 notAfter 在 2027 或 2030,證明不了期限後舊鏈還能用。BR 4.9.1.2 要求 CA 得知中繼簽發不合規等情形後七天內撤銷;4.9.1.1 第 12 項對終端是 SHOULD 24 小時、MUST 5 天,短效期憑證另有例外。這些是規格,TWCA 沒公告終端怎麼處理,本文不替它算截止日,也不需要為此去改使用者的瀏覽器信任設定。

換證與驗證

公告寫明的只有:新中繼重簽、沿用金鑰對、收到就裝、要含完整鏈。新中繼的名稱與金鑰沒交代,換完別只看 issuer 名稱有沒有變,要比對新憑證與指紋。以下是一般維運檢查,驗證保持開啟:

  • 盤點用到這批 TWCA SSL 憑證的網域與服務,TLS 終止在 LB、CDN、Ingress、IIS,還是應用程式自己。
  • Nginx 的 ssl_certificate 指向終端在前、中繼在後的 fullchain;IIS 把中繼匯入本機電腦的「中繼憑證授權單位」存放區;Java keystore 更新對應私鑰項目的憑證鏈。
  • 換在實際終止 TLS 的那一層。前面有 CDN 或 LB 卸 TLS,只換來源站,外面看到的鏈不會變。
  • 從外面看伺服器送出的鏈,別只看磁碟上的檔案。CT log(例如 crt.sh)能確認新憑證或預憑證有沒有登錄,證明不了已經部署。

chain.sh 只列出伺服器送出的每張憑證,輸出不代表信任鏈、主機名或撤銷檢查已通過。它會在目前目錄寫 certN.pem,結束時刪掉 cert*.pem,請在空目錄執行。指令與輸出來自 2026 年 11 月 2 日 20:44,macOS、LibreSSL 3.3.6 對 www.twca.com.tw 的一次連線,原樣保留。

#!/bin/sh
# 列出伺服器實際送出的每張憑證:subject、issuer、SHA-256 指紋、到期日
host="$1"
echo | openssl s_client -connect "$host:443" -servername "$host" -showcerts 2>/dev/null |
  awk '/BEGIN CERTIFICATE/{n++; f="cert" n ".pem"} f{print > f} /END CERTIFICATE/{f=""}'
for f in cert*.pem; do
  echo "== $f"
  openssl x509 -in "$f" -noout -subject -issuer -enddate
  openssl x509 -in "$f" -noout -fingerprint -sha256
done
rm -f cert*.pem
== cert1.pem
subject= /businessCategory=Private Organization/jurisdictionCountryName=TW/jurisdictionStateOrProvinceName=Taiwan/jurisdictionLocalityName=Taipei/serialNumber=70759028/C=TW/ST=Taiwan/L=Taipei/postalCode=100/street=10F.,NO.85,Yanping S. Rd.,Taipei City 100,Taiwan (R.O.C)/O=TAIWAN-CA INC./CN=www.twca.com.tw
issuer= /C=TW/O=TAIWAN-CA/OU=Global EVSSL Sub-CA/CN=TWCA Global EVSSL Certification Authority
notAfter=Mar  6 15:59:59 2027 GMT
SHA256 Fingerprint=53:D5:48:E7:AD:6E:B8:E5:DD:90:CE:34:45:33:06:8C:8F:E3:D2:9E:D2:4B:B2:E0:DA:51:36:DC:45:DF:8B:02
== cert2.pem
subject= /C=TW/O=TAIWAN-CA/OU=Global EVSSL Sub-CA/CN=TWCA Global EVSSL Certification Authority
issuer= /C=TW/O=TAIWAN-CA/OU=Root CA/CN=TWCA Global Root CA
notAfter=Aug 23 15:59:59 2030 GMT
SHA256 Fingerprint=49:69:5A:5F:0F:7E:F6:ED:F6:98:19:3D:99:ED:48:BA:AD:E2:0E:A4:57:40:3C:11:CE:AD:49:2C:45:86:65:DA
== cert3.pem
subject= /C=TW/O=TAIWAN-CA/OU=Root CA/CN=TWCA Global Root CA
issuer= /C=TW/O=TAIWAN-CA/OU=Root CA/CN=TWCA Root Certification Authority
notAfter=Oct 28 15:59:59 2030 GMT
SHA256 Fingerprint=8A:D4:7F:6D:70:A4:4F:A8:0A:F0:F9:31:12:5F:FE:3A:76:87:6F:FA:D2:19:A4:D4:0A:13:C0:38:DC:85:E6:9E

這次送出三張:www.twca.com.tw、TWCA Global EVSSL Certification Authority、TWCA Global Root CA。第三張由 TWCA Root Certification Authority 簽發,是交叉簽署憑證,名稱有 Root 不代表它是這次驗證的信任錨。notAfter 都是 15:59:59 GMT,也就是台北時間當天 23:59:59。同一次連線另記下終端序號 47EA000000125CE071DBC24EAA7BA455、notBefore 2026-02-26,腳本沒印這兩項。cert2 的指紋對得上 2087236 附錄裡的 TWCA Global EVSSL Certification Authority,它是不是 11 月 6 日要廢止的那張,公告沒有名單,無從確認。這是單一樣本,只用來示範,不能拿來證明或反駁 2087918 的觀察。

用戶端與 pinning

有做 pinning 的 App,先確認 pin 的是中繼、根還是終端,比對的是整張憑證還是公鑰。pin 舊中繼公鑰的,新鏈裡若沒有相符的公鑰,瀏覽器接受,App 照樣拒絕;pin 根公鑰的,要確認新路徑仍經過那把公鑰。pin 終端公鑰的,金鑰對沿用,通常還對得上,但仍須通過一般憑證驗證;pin 整張終端憑證的,重簽後要更新。Java、舊 Android 與內嵌 truststore 的信任錨和桌面瀏覽器不一定一樣,瀏覽器打得開不算數,要各自測。

尚未釐清的事

  • 要廢止哪幾張中繼。2087236 的 6 張是回報者的清單,公告沒有列出名單。
  • 00:00 的時區。看成台北時間是 11 月 5 日 16:00 UTC,看成 UTC 是台北時間 11 月 6 日 08:00,排程保守一點,以台北時間 11 月 6 日 00:00 為準。
  • 終端憑證會不會撤銷、何時撤銷;新中繼的名稱、指紋與金鑰;是否收費。
  • RA 事件的範圍、成因,以及和序號問題有沒有關係。
  • 後續要追:11 月 12 日 19:00 UTC 前的完整報告,Root cause 等欄位有沒有填上;三個 bug 上有沒有根憑證計畫的處置;TWCA 有沒有補上名單、時區與新中繼指紋。

補充筆記

  • 原中繼要在 2026 年 11 月 6 日 00:00 前廢止,英文公告寫撤銷,時區與名單未載明;客戶憑證沿用金鑰對,安裝要含完整鏈。
  • 換證公告、序號熵、RA 未授權存取是三類分開的紀錄,公開來源尚未確認三者的因果關係。
  • CA 序號看似隨機的最多 24 bits,終端樣本至多 63 bits;熵不足違反 BR,不等於私鑰外洩或可以偽造。
  • 到期、撤銷、移除根信任、沒送完整鏈是四種不同的失敗;中繼撤銷後,notAfter 再遠也不能保證經過它的路徑仍可用。
  • 從外面看實際送出的鏈;pinning、Java、舊 Android 與內嵌 truststore 要另外測。

延伸閱讀

想法與技術判斷出自 Sheng,和 Claude 一起起草 · 題目由 Sheng 選定,初稿 Grok(grok-4.7),Claude Fable 定稿,Codex(gpt-6-astra)二審,Claude 精簡,「維運的幾個疑問」一節由 Grok 起稿;範例在 macOS 以 LibreSSL 3.3.6 實測,資料查核至 2026-11-02 22:12。