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

> TWCA 原中繼憑證要在 2026 年 11 月 6 日 00:00 前廢止，英文公告寫明撤銷。本文整理換證要做的事、序號熵與 RA 兩件另案，附實測過的憑證鏈檢查指令。

原文：https://sheng.page/posts/twca-intermediate-replacement-what-to-check/ · 發布：2026-11-02 · 作者：Sheng

去年中華電信那次，使用 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` 的一次連線，原樣保留。

```sh
#!/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
```

```text
== 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 要另外測。

## 延伸閱讀

- [TWCA〈TWCA SSL 更換憑證公告〉](https://ssl.twca.com.tw/news_detail/5f3395bf-bef6-4b40-b922-ceac4b06bf53)：2026 年 10 月 31 日的一手公告，同頁英文版寫原中繼須撤銷。
- [Mozilla Bugzilla 2087236](https://bugzilla.mozilla.org/show_bug.cgi?id=2087236)：CA 憑證序號的回報與 TWCA 的 Comment 3，開立時間以系統紀錄為準。
- [Mozilla Bugzilla 2087918](https://bugzilla.mozilla.org/show_bug.cgi?id=2087918)：終端憑證序號的回報，TWCA 在此表示報告併入 2087236。
- [Mozilla Bugzilla 2086949](https://bugzilla.mozilla.org/show_bug.cgi?id=2086949)：TWCA 自行通報的 RA 未授權存取，目前只有初步報告。
- [CA/Browser Forum TLS Baseline Requirements v2.3.1](https://cabforum.org/working-groups/server/baseline-requirements/requirements/)（2026-10-04）：序號熵、中繼七天與終端五天的條文原文，沒有對這次事件做裁定。
- [CA/Browser Forum Ballot 164](https://cabforum.org/2016/03/31/ballot-164-certificate-serial-number-entropy/)：2016 年把序號熵寫進 BR 的修訂與理由。
- [〈MD5 considered harmful today〉](https://marc-stevens.nl/research/hashclash/rogue-ca/)：2008 年偽造 CA 的一手研究。
- [Google〈Sustaining Digital Certificate Security - Upcoming Changes to the Chrome Root Store〉](https://blog.google/security/sustaining-digital-certificate-security-chrome-root-store-changes/)：2025 年 5 月 30 日的一手公告，開頭提到的中華電信處置以這篇為準，和 TWCA 無關。
- [RFC 5280](https://datatracker.ietf.org/doc/html/rfc5280)：有效期間、信任錨、驗證路徑與撤銷檢查的規格。
- [Nginx HTTPS 設定](https://nginx.org/en/docs/http/configuring_https_servers.html)、[Microsoft IIS 中繼憑證設定](https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/iis/www-authentication-authorization/configure-intermediate-certificates)、[Oracle keytool 文件](https://docs.oracle.com/en/java/javase/25/docs/specs/man/keytool.html)：完整鏈的排列、IIS 存放區與 Java 私鑰項目的憑證鏈。
- [Certificate Transparency〈How CT works〉](https://certificate.transparency.dev/howctworks/)：CT 登錄憑證與預憑證，不反映伺服器目前部署了什麼。
- [Android Network security configuration](https://developer.android.com/privacy-and-security/security-config)、[OWASP Pinning Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Pinning_Cheat_Sheet.html)：自訂信任錨、公鑰 pin 與整張憑證 pin 的差異。

> 想法與技術判斷出自 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。