外观
GitHub 提示 SSL 证书错误怎么办
Git 访问 GitHub 时报各种 SSL 错误,常见几种:
text
SSL certificate problem: unable to get local issuer certificate
OpenSSL SSL_read: Connection was reset
schannel: failed to receive handshake, SSL/TLS connection failed
gnutls_handshake() failed它们成因不同,别急着关闭证书校验(那是最后手段且有安全风险)。先对症下药。
一、先判断类型
| 报错关键词 | 大概率原因 |
|---|---|
unable to get local issuer certificate | 本地 CA 证书缺失/过期 |
Connection was reset / SSL_read | 网络层被干扰,不是证书本身问题 |
schannel | Windows 用系统证书库,常与代理/拦截有关 |
certificate has expired / 时间相关 | 系统时间不对 |
二、系统时间不对(最容易忽略)
证书校验依赖当前时间。系统时间偏差过大会导致"证书过期/尚未生效"。先校准时间:
powershell
# Windows:同步时间
w32tm /resyncbash
# Linux
sudo ntpdate pool.ntp.org # 或开启 systemd-timesyncd三、unable to get local issuer certificate
本地缺可信 CA 证书。正确做法是补证书,而不是关校验。
Git for Windows:自带证书,升级到最新版 Git 通常即可解决。或指定证书:
bash
git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/etc/ssl/certs/ca-bundle.crt"Linux:更新系统 CA:
bash
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install --reinstall ca-certificates
# CentOS/RHEL
sudo yum reinstall ca-certificates改用 OpenSSL 后端(Windows):schannel 出问题时可切回 OpenSSL:
bash
git config --global http.sslBackend openssl四、Connection was reset / handshake failed
这类不是证书坏了,是握手被中途打断——典型的网络干扰。证书配置怎么改都没用,解决方向是:
- 走 代理;
- 或换 SSH 443;
- 参考 443 连接失败排查。
五、代理拦截导致的证书错误
如果你用了会做 HTTPS 解密的代理/安全软件(企业网关、部分杀软),证书链会被替换,导致校验失败。办法:
- 把企业根证书导入信任库;
- 或让 git 只对 github 走你自己的干净代理(见 Git 设置代理)。
六、最后手段:临时关闭校验(不推荐)
只有在你明确信任网络环境、且急需一次性操作时:
bash
# 临时:仅本次命令
git -c http.sslVerify=false clone https://github.com/...
# 全局(有安全风险,用完记得改回)
git config --global http.sslVerify false
# 恢复
git config --global http.sslVerify true安全警告
关闭 sslVerify 会让你无法察觉中间人攻击。切勿在不可信网络长期关闭,操作完立即恢复为 true。
排查速查
text
SSL 报错
├─ 提示过期/时间? → 校准系统时间(方法二)
├─ local issuer? → 更新/指定 CA 证书(方法三)
├─ reset / handshake? → 网络干扰,走代理/SSH443(方法四)
├─ 用了企业网关/杀软? → 导入根证书(方法五)
└─ 急用一次 → 临时 sslVerify=false,用完恢复(方法六)小结
- 先看是"证书问题"还是"网络问题"——
reset/handshake类是网络,别瞎改证书。 - 缺证书就补证书 / 升级 Git,别直接关校验。
- 关校验是最后手段,用完立刻恢复。
本文仅供技术学习与研究,请遵守所在国家/地区法律法规。