Git for Windows执行git pull时报SSL certificate problem: certificate has expired错误
问题根因
你遇到的报错本质是两个因素共同导致的:
- 你公司Git服务端当前返回的是Let's Encrypt为了兼容旧安卓设备提供的长证书链,R3中间证书的签发者指向已经过期的DST Root CA X3根证书
- Git for Windows默认使用内置的OpenSSL和自带的CA证书bundle,验证逻辑会优先匹配服务端返回的链中的根证书,触发过期校验失败;而Chrome、火狐等浏览器的证书库已移除过期的DST根,会自动使用信任的ISRG Root X1根证书验证R3中间证书,因此可以正常访问。
解决方法
你可以按优先级选任意一种方案操作:
方案1:切换Git使用Windows系统证书库(最快生效)
Git for Windows支持使用schannel作为SSL后端,直接调用Windows系统的证书存储,和Chrome的验证逻辑完全一致。只需要执行一行命令即可:
git config --global http.sslBackend schannel
执行完成后再重试git pull操作,一般就能恢复正常。
方案2:删除Git内置CA库中的过期根证书
如果你需要保留OpenSSL作为SSL后端,可以手动移除内置CA证书里过期的DST Root CA X3:
- 打开Git安装目录下的证书文件,默认路径为
C:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt - 搜索
DST Root CA X3对应的证书段,从-----BEGIN CERTIFICATE-----到-----END CERTIFICATE-----整段删除 - 保存文件后重试Git操作即可
方案3:调整Git服务端的证书链配置
如果有权限修改Git服务端的证书配置,可以将服务端返回的证书链切换为Let's Encrypt的默认短链,直接将R3中间证书锚定到ISRG Root X1根证书,不需要携带指向DST根的交叉签名证书,所有新版客户端都可以正常验证,从根源避免这个问题。
内容的提问来源于stack exchange,提问作者Jürgen Steinblock
相关产品推荐
相关产品推荐

