VPN、代理伺服器與過濾器

公司代理伺服器憑證導致 Mac 上的終端機工具失效

有些公司網路會檢查 HTTPS 流量。代理伺服器會用公司的根憑證重新簽署流量,不信任這張憑證的工具就會停止運作。

適用於:所有目前的 macOS 版本。Node.js 的 NODE_USE_SYSTEM_CA 需要 Node.js 22.19、24.6 或更新版本。檢查日期:2026年10月29日

症狀

  • npm 或 Node 顯示「self-signed certificate in certificate chain」或「unable to get local issuer certificate」。
  • Git 對 HTTPS 遠端儲存庫顯示「SSL certificate problem」。
  • Safari 可以打開網站,curl 或 Python 卻不行。
  • 錯誤只在公司網路或 VPN 上發生。

可能原因

  • TLS 檢查。代理伺服器會把網站的憑證換成由公司根憑證簽署的憑證。
  • 各自獨立的信任儲存區。Safari 使用 macOS 鑰匙圈,許多命令列工具則使用自己的受信任憑證列表。
  • 缺少代理伺服器設定。終端機中的工具不一定會使用系統代理伺服器,它們需要代理伺服器環境變數或自己的設定。

如何檢查

  1. 顯示伺服器傳送的憑證鏈,查看最上層憑證的簽發者。

    openssl s_client -connect registry.npmjs.org:443 -servername registry.npmjs.org -showcerts </dev/null
  2. 用 curl 顯示 TLS 交握過程。

    curl -v https://registry.npmjs.org/ -o /dev/null
  3. 在「鑰匙圈存取」中找到公司的根憑證。在「系統」鑰匙圈中搜尋你的公司名稱。

  4. 顯示 shell 中的代理伺服器環境變數。

    env | grep -i proxy

如何修正

  1. 向 IT 團隊索取 PEM 檔案格式的公司根憑證。不要信任來源不明的憑證。

  2. 對於 Node.js 工具,請在 NODE_EXTRA_CA_CERTS 中指定該檔案。設定後重新啟動工具。

    export NODE_EXTRA_CA_CERTS=~/certs/company-root.pem
  3. 使用 Node.js 22.19、24.6 或更新版本時,可以直接使用鑰匙圈信任的憑證。

    export NODE_USE_SYSTEM_CA=1
  4. 對於 npm,設定憑證檔案。

    npm config set cafile ~/certs/company-root.pem
  5. 對於 Git,設定憑證檔案。

    git config --global http.sslCAInfo ~/certs/company-root.pem
  6. 對於 curl,用 --cacert 指定該檔案。

    curl --cacert ~/certs/company-root.pem https://example.com
  7. 如果 IT 團隊有使用代理伺服器,請為終端機工具設定公司的代理伺服器。

    export https_proxy=http://proxy.example.com:8080
  8. 不要關閉憑證檢查,例如 strict-ssl 或 http.sslVerify,這會讓連線變得不安全。

使用 Kilobat

  1. Kilobat 的連線檢查會將 TLS 失敗列為獨立的一層,也會告訴你系統代理伺服器是否在直接連線失敗時仍可運作。

    kilobat why https://registry.npmjs.org/
  2. 加上 --app,即可使用該 App 執行環境中的代理伺服器變數。

    kilobat why https://registry.npmjs.org/ --app process:node

常見問題

為什麼 Safari 可以用,npm 卻失敗?

Safari 信任 macOS 鑰匙圈中的憑證。除非你加入公司憑證,否則 npm 只使用 Node.js 內建的憑證。

把 strict-ssl 設為 false 安全嗎?

不安全。這會停止對套件登錄的所有憑證檢查。請改為加入公司的根憑證。

資料來源

資料來源檢查日期:2026年10月29日。man 頁面為 macOS 內建版本;在終端機中用 man <name> 開啟。