取得遠端自簽根憑證並加入本地信任以解除 ERR_CERT_AUTHORITY_INVALID

2026-05-29T23:36:11+08:00

問題情境

自架服務(如 GitLab)使用 mkcert 自簽憑證後,瀏覽器會出現「您的連線並非私人連線」警告,網址列 HTTPS 被標示為紅色刪除線,錯誤碼為 net::ERR_CERT_AUTHORITY_INVALID

根本原因是瀏覽器不信任 mkcert 在伺服器端建立的本地 CA,需要把那個根 CA 憑證匯入到 macOS 系統鑰匙圈。


釐清:需要的是根 CA,不是伺服器憑證

憑證類型說明是否有效
葉片憑證(leaf cert)伺服器本身的憑證,如 gitlab.example.com❌ 匯入無效
根 CA 憑證(root CA cert)mkcert 產生的本地 CA,用來簽發伺服器憑證✅ 正確目標

判斷方式:

openssl x509 -in 憑證.pem -noout -subject -issuer
  • Subject == Issuer 且含 CA:TRUE → 根 CA,正確
  • Subject != Issuer → 葉片憑證,不能用

取得根 CA 憑證的方法

方法 A:請伺服器管理員提供(最可靠)

請管理員在伺服器上執行:

cat $(mkcert -CAROOT)/rootCA.pem

將輸出內容(含 -----BEGIN CERTIFICATE----------END CERTIFICATE-----)存成本機的 rootCA.pem

方法 B:用 openssl 從伺服器擷取憑證鏈

openssl s_client -connect 伺服器域名:443 -showcerts </dev/null 2>/dev/null \
  | awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' > ~/Downloads/chain.pem

確認張數:

grep -c 'BEGIN CERTIFICATE' ~/Downloads/chain.pem

若大於 1,取出最後一張(根 CA):

awk '/BEGIN CERTIFICATE/{cert=""} {cert=cert"\n"$0} /END CERTIFICATE/{last=cert} END{print last}' \
  ~/Downloads/chain.pem > ~/Downloads/rootCA.pem

注意:若伺服器 TLS 設定未附帶 CA 憑證,此方法輸出張數仍會是 1,只能改用方法 A。

方法 C:從已信任該 CA 的瀏覽器憑證檢視器匯出

前提:此方法需要在已信任該根 CA 的機器上操作(例如同事的電腦,或是管理員的機器)。若本機瀏覽器尚未信任,匯出結果只會是葉片憑證,無法使用。

  1. 在已信任的機器上,用 Chrome / Edge 開啟目標網址
  2. 點網址列鎖頭圖示 →「憑證」
  3. 切到「憑證路徑」,選取最頂層節點(根 CA,通常含 mkcert
  4. 切回「詳細資訊」→「複製到檔案
  5. 選「Base64 編碼的 ASCII,憑證鏈結」匯出,將檔案傳給需要信任的機器

說明:瀏覽器在已信任狀態下匯出「憑證鏈結」,會主動從系統鑰匙圈把根 CA 補入,因此才能取得完整鏈;未信任時則只能取得伺服器送出的葉片憑證。


加入 macOS 系統信任

sudo security add-trusted-cert -d -r trustRoot \
  -k /Library/Keychains/System.keychain ~/Downloads/rootCA.pem

執行後通常不需重啟瀏覽器,Chrome / Edge 會即時偵測鑰匙圈變更。

Firefox 有獨立憑證庫,需另至「設定 → 隱私與安全 → 憑證 → 匯入」手動加入。


清除錯誤匯入的葉片憑證

若先前誤將葉片憑證以 trustRoot 加入,應予以刪除:

# 查詢 fingerprint
openssl x509 -in 葉片憑證.pem -noout -fingerprint -sha1
# 輸出範例:sha1 Fingerprint=72:B6:CD:55:7F:78:39:FF:5B:A3:91:05:B3:DF:7F:5A:71:29:F1:D7

# 刪除(fingerprint 不含冒號)
sudo security delete-certificate -Z 72B6CD557F7839FF5BA39105B3DF7F5A7129F1D7 \
  /Library/Keychains/System.keychain

也可以用 GUI:開啟「鑰匙圈存取」→ 左側選「系統」→「憑證」→ 找到對應項目右鍵刪除。


驗證

# 確認根 CA 已在鑰匙圈中
security find-certificate -a -p /Library/Keychains/System.keychain \
  | openssl x509 -noout -subject 2>/dev/null | grep -i mkcert

# 確認信任設定已套用
security dump-trust-settings -d | grep -A5 mkcert