取得遠端自簽根憑證並加入本地信任以解除 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 的機器上操作(例如同事的電腦,或是管理員的機器)。若本機瀏覽器尚未信任,匯出結果只會是葉片憑證,無法使用。
- 在已信任的機器上,用 Chrome / Edge 開啟目標網址
- 點網址列鎖頭圖示 →「憑證」
- 切到「憑證路徑」,選取最頂層節點(根 CA,通常含
mkcert) - 切回「詳細資訊」→「複製到檔案」
- 選「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