ある日、Mac の上で HTTPS の通信だけがすべて失敗するようになりました。
-
curlはどこに向けてもHTTP 000 - Node は
unable to get local issuer certificate - 定期実行のジョブは
ENOTFOUNDで即終了
一方で、DNS は引けるし、HTTP(80番)は 200 が返ります。回線の障害に見えますが、違いました。
原因
環境変数 SSL_CERT_FILE が、存在しないファイルを指していました。
curl -sS https://www.google.com
# curl: (77) error setting certificate verify locations
env | grep -iE "SSL_CERT|CA_BUNDLE|NODE_EXTRA"
SSL_CERT_FILE の指す先が無いと、curl は HTTPS を始める前に終わります。Node の NODE_EXTRA_CA_CERTS なども同じ系統なので、まとめて確認します。
シェルの設定を直しても直らない
.zprofile や .zshrc を直して、/etc/ssl/cert.pem を指すようにしても、すでに起動しているアプリは古い値を持ったままです。新しいターミナルでは再現しないのに、そのアプリから動くジョブだけが失敗し続けます。
- 直し方:設定を直したうえで、アプリを再起動する
- 応急処置で、指されているパスに
/etc/ssl/cert.pemをコピーすると一時的には通ります。ただ、古い値を持ったプロセスが残るので恒久策にはなりません(実際、同じ日の別の時刻のジョブがまた失敗しました)
調べるときの注意
macOS の zsh には timeout コマンドがありません。疎通確認のスクリプトで timeout 5 curl … と書くと command not found になり、それを「通信失敗」と読み違えます。
まとめ
- HTTPS だけ全滅・DNS と HTTP は通る → まず
SSL_CERT_FILEを見る - 設定を直したら、そのアプリを再起動する
生成AI(Claude Code)に書かせて一人で会社を回している記録を note に書いています。
https://note.com/kaito_cometa