用 Mac 做开发的朋友有没有遇到这个坑:好好的环境突然就不行了 ------git clone 拉代码报证书验证失败,curl 请求接口提示 SSL 连接错误,pip install 装 Python 包也频频报错。 折腾了代理、网络、DNS 一圈,最后发现根本不是网的问题,而是 eMudhra 根证书被苹果官方吊销 引发的连锁反应。
分享两套可直接照着操作的修复方案,从临时应急到彻底根治都有。
一、这次为啥突然就证书报错了?
1. 起因是酱婶儿的
印度一家叫 eMudhra 的证书机构,它的根证书出现了安全泄露问题。苹果在 10 月 25 日正式宣布封锁这张证书,把它从系统的可信名单里移除了。 正常来说,这是一次常规的安全更新,但麻烦就麻烦在 macOS 的「两套证书体系」上。
2. 最最关键的知识点:Mac 有两套 "可信证书名单"
很多人不理解:我系统更到最新了,Safari 浏览器访问网站都正常,怎么命令行就不行? 原因是 macOS 里其实有两套独立的可信证书库,各管各的,互不同步:
-
第一套:系统钥匙串 给 Safari、App Store、各种桌面软件用。系统后台自动更新,eMudhra 证书已经被这里移除了,所以浏览器访问一切正常。
-
第二套:命令行证书文件 路径是
/etc/ssl/cert.pem,是一个纯文本文件,里面存了所有受信任的根证书。curl、git、pip、gem这类命令行工具,默认都会读这个文件来校验证书。 问题就出在这:苹果的系统安全更新,不会自动更新这个文件 。于是就出现了 "系统已经不认这张证书了,但命令行工具还在拿旧名单校验" 的矛盾,自然就报错了。
二、临时应急方案:先跳过证书验证
如果你现在急着拉代码、装依赖,想先跑通流程,可以用这个方法临时跳过证书校验。
⚠️ 注意:这个方法有安全风险,仅适合临时应急使用,问题解决后建议立刻改回来,用下面的根治方案。
curl 临时跳过
在命令后面加 -k 参数即可:
curl -k https://你的目标地址
Git 临时关闭证书校验
全局关闭 SSL 验证:
git config --global http.sslVerify false
用完记得改回来:
git config --global http.sslVerify true
Python pip 临时跳过
在 install 命令后加参数:
pip install 包名 --trusted-host pypi.org --trusted-host files.pythonhosted.org
三、根治方案一:手动更新命令行证书文件(通用推荐)
这个方法最直接,就是把系统里旧的 cert.pem 替换成最新的可信证书集合,一劳永逸,所有命令行工具都会生效。 全程就 4 步,跟着复制命令就行。
第 1 步:先备份原文件(防翻车)
先把原来的证书文件备份一份,万一操作错了还能恢复:
sudo cp /etc/ssl/cert.pem /etc/ssl/cert.pem.backup
输入你的电脑开机密码即可(输入时密码不会显示,输完回车就行)。
第 2 步:下载最新的可信证书包
我们直接从 curl 官方维护的可信根证书集合下载,来源可靠:
sudo curl -k https://curl.se/ca/cacert.pem -o /etc/ssl/cert.pem
这里加 -k 是因为当前证书还没修好,下载自身也需要跳过校验,属于 "用魔法打败魔法"。
第 3 步:修复文件权限
确保文件权限正确,系统能正常读取:
sudo chmod 644 /etc/ssl/cert.pem
第 4 步:验证是否生效
执行一条简单的 curl 命令,不报错就说明修好了:
curl https://www.baidu.com
能正常返回网页内容,没有 SSL 错误提示,就代表修复成功。
四、根治方案二:用 Homebrew 更新工具链(适合开发者)
如果你平时用 Homebrew 管理开发环境,这个方法更省心,不用修改系统文件。 原理是:用 Homebrew 安装的 curl 和 openssl 会自带最新的证书库,我们让终端优先用 brew 版本的工具就行。
第 1 步:更新 Homebrew 并升级组件
brew update
brew install openssl curl
如果已经安装过,就执行升级:
brew upgrade openssl curl
第 2 步:让终端优先使用 brew 版本的 curl
根据你用的终端(zsh 或 bash),把下面的配置加到环境变量里。 以最常用的 zsh 为例:
echo 'export PATH="/usr/local/opt/curl/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
如果是 Apple Silicon(M 系列芯片)的 Mac,路径略有不同:
echo 'export PATH="/opt/homebrew/opt/curl/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
第 3 步:验证
查看当前 curl 版本,显示是 brew 安装的就对了:
which curl
再执行一次 curl 请求测试,无报错即生效。
五、常用开发环境补充配置
大部分情况做完上面的根治方案,所有命令行工具就都正常了。如果个别工具还有问题,可以单独做配置。
1. Git 单独指定证书路径
如果 Git 还是报错,可以手动告诉它用最新的证书文件:
git config --global http.sslCAInfo /etc/ssl/cert.pem
2. Python /pip 修复
升级 certifi 包(Python 自带的证书库):
pip install --upgrade certifi
3. Node.js/npm 修复
通过环境变量指定额外的可信证书:
export NODE_EXTRA_CA_CERTS=/etc/ssl/cert.pem
想永久生效就把这句话加到 ~/.zshrc 里。
六、以后再遇 SSL 证书报错,按这个思路排查
这次是 eMudhra 事件,以后说不定还会遇到其他证书问题,记住这个通用排查顺序:
-
先看系统时间:电脑时间不对是证书报错的常见原因,先确认日期时间是自动同步的。
-
区分场景:是浏览器正常、只有命令行报错,还是全都不行?前者基本就是命令行证书库的问题。
-
临时验证:先加参数跳过证书验证,如果能通,就 100% 是证书问题,不是网络或服务端的锅。
-
定位证书库 :确认当前工具读的是哪个证书文件,针对性更新即可。
最后
这次事件本质上是一次常规的安全更新,只是因为 macOS 命令行证书不自动同步的机制,坑了一大批开发者。 推荐优先用「方案一手动更新系统证书文件」,一次操作全工具生效,最省事。如果是长期做开发、习惯用 Homebrew 管理环境,方案二也很稳妥。