macOS 命令行 curl/git 报 SSL 证书错误?eMudhra 事件完整修复指南

用 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 事件,以后说不定还会遇到其他证书问题,记住这个通用排查顺序:

  1. 先看系统时间:电脑时间不对是证书报错的常见原因,先确认日期时间是自动同步的。

  2. 区分场景:是浏览器正常、只有命令行报错,还是全都不行?前者基本就是命令行证书库的问题。

  3. 临时验证:先加参数跳过证书验证,如果能通,就 100% 是证书问题,不是网络或服务端的锅。

  4. 定位证书库 :确认当前工具读的是哪个证书文件,针对性更新即可。


最后

这次事件本质上是一次常规的安全更新,只是因为 macOS 命令行证书不自动同步的机制,坑了一大批开发者。 推荐优先用「方案一手动更新系统证书文件」,一次操作全工具生效,最省事。如果是长期做开发、习惯用 Homebrew 管理环境,方案二也很稳妥。

相关推荐
keyipatience2 小时前
Git学习(4)Git分布式优势与实战配置全解析
git·学习
SH的全栈笔记4 小时前
敲下 git add 的那一刻,.git 里多了什么
git·后端
zxanz16 小时前
国密 SM2 SSL 证书和国际证书怎么选,一文理清差异
https·ssl
清水白石0086 小时前
Python 安装与环境配置:Windows、macOS、Linux 完整指南(第2集)
windows·python·macos
hhhjhl7 小时前
开源鸿蒙平台 CMP 三方库「compose-macos-26-ui」适配全流程
macos·开源·harmonyos
正经教主7 小时前
【FDE系列】阶段2:Day 45(up详细版):综合实战 — Docker + Nginx + Git 完整部署与本周收官
人工智能·git·nginx·docker·fde
RacentCLM20 小时前
证书即服务CaaS:从申请、续期到部署的自动化链路拆解
运维·数据库·自动化·ssl
七牛云行业应用1 天前
DeepSeek Harness(dsh)安装完整指南:Windows、macOS、Linux 三平台 + 桌面端与 Web 端全覆盖
linux·windows·macos·ai·ai编程
Change!!1 天前
git小乌龟,切换到新分支处理
git·git切到新分支,旧代码贮藏