VPN、代理伺服器與過濾器
公司代理伺服器憑證導致 Mac 上的終端機工具失效
有些公司網路會檢查 HTTPS 流量。代理伺服器會用公司的根憑證重新簽署流量,不信任這張憑證的工具就會停止運作。
症狀
- 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 鑰匙圈,許多命令列工具則使用自己的受信任憑證列表。
- 缺少代理伺服器設定。終端機中的工具不一定會使用系統代理伺服器,它們需要代理伺服器環境變數或自己的設定。
如何檢查
顯示伺服器傳送的憑證鏈,查看最上層憑證的簽發者。
openssl s_client -connect registry.npmjs.org:443 -servername registry.npmjs.org -showcerts </dev/null用 curl 顯示 TLS 交握過程。
curl -v https://registry.npmjs.org/ -o /dev/null在「鑰匙圈存取」中找到公司的根憑證。在「系統」鑰匙圈中搜尋你的公司名稱。
顯示 shell 中的代理伺服器環境變數。
env | grep -i proxy
如何修正
向 IT 團隊索取 PEM 檔案格式的公司根憑證。不要信任來源不明的憑證。
對於 Node.js 工具,請在
NODE_EXTRA_CA_CERTS中指定該檔案。設定後重新啟動工具。export NODE_EXTRA_CA_CERTS=~/certs/company-root.pem使用 Node.js 22.19、24.6 或更新版本時,可以直接使用鑰匙圈信任的憑證。
export NODE_USE_SYSTEM_CA=1對於 npm,設定憑證檔案。
npm config set cafile ~/certs/company-root.pem對於 Git,設定憑證檔案。
git config --global http.sslCAInfo ~/certs/company-root.pem對於 curl,用
--cacert指定該檔案。curl --cacert ~/certs/company-root.pem https://example.com如果 IT 團隊有使用代理伺服器,請為終端機工具設定公司的代理伺服器。
export https_proxy=http://proxy.example.com:8080不要關閉憑證檢查,例如
strict-ssl或http.sslVerify,這會讓連線變得不安全。
使用 Kilobat
Kilobat 的連線檢查會將 TLS 失敗列為獨立的一層,也會告訴你系統代理伺服器是否在直接連線失敗時仍可運作。
kilobat why https://registry.npmjs.org/加上
--app,即可使用該 App 執行環境中的代理伺服器變數。kilobat why https://registry.npmjs.org/ --app process:node
常見問題
為什麼 Safari 可以用,npm 卻失敗?
Safari 信任 macOS 鑰匙圈中的憑證。除非你加入公司憑證,否則 npm 只使用 Node.js 內建的憑證。
把 strict-ssl 設為 false 安全嗎?
不安全。這會停止對套件登錄的所有憑證檢查。請改為加入公司的根憑證。
資料來源
- Node.js:Command-line API、NODE_EXTRA_CA_CERTS 與 --use-system-ca
- npm Docs:config(cafile、proxy、https-proxy、strict-ssl)
- git-config(1)、http.sslCAInfo 與 http.proxy,macOS 27.2 內建的 man 頁面(Git 2.56)
- Apple 支援:在「鑰匙圈存取」中更改憑證的信任設定
- curl(1),macOS 27.2 內建的 man 頁面
資料來源檢查日期:2026年10月29日。man 頁面為 macOS 內建版本;在終端機中用 man <name> 開啟。