Git设置忽略证书后续。
前言
自己做了个Github镜像,相关域名通过Cloudflare有了一层中转。 先前使用Git+https推拉项目就报证书过期错误,当时临时解决方案是忽略证书检查,心里一直有个疙瘩。
fatal: unable to access 'https://path/to/repo.git/': SSL certificate problem: certificate has expired
我记得这个域名浏览器访问一直没问题,使用Fiddler抓包发现从代理到源地址也是OK,就很困扰。
主要是报错提示并不完整,我一直以为是域名的证书过期,但它实际上没过期。那么,有没有一种可能,是给它签发的CA证书过期了???
结果还真是这么回事。
Cloudflare使用Let’s Encrypt签发的证书。而Let’s Encrypt签发的证书使用DST Root CA X3
和ISRG Root X1
交叉认证(详见此处)。
在一些老旧的设备或程序中,以上二者信任的CA只有DST Root CA X3
,且它存的对应证书日期已经到期,这就是我们遇到问题的原因。
解决方案
下载可信的CA根证书
可以参考https://curl.se/docs/caextract.html
以上提取自Mozilla,如果使用这个CA组合,在证书检查的行为上应该是和火狐浏览器行为一致。
下载下来的后缀是.pem
,一般来说,直接改成.crt
也不是不行。不管用的话再使用openssl转换。
openssl x509 -in cacert.pem -out cacert.crt
信任CA根证书
两个办法,一个直接替换掉旧的CA证书套餐,另一个通过配置指定CA根证书文件位置。
- 直接替换
找到Git安装目录下的
ca-bundle.crt
例如,Windows下, D:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt 找不到的话,可以再试一试Git附近的bin目录
- 指定位置
git config --system http.sslCAInfo D:\Work\0_cert\cacert.pem 或者相当于配置文件 [http] sslCAInfo = D:\\Work\\0_cert\\cacert.pem
想要达到自己预期的效果,可以参考git-config,搜索ssl配置的关键词
sslCAInfo
、sslCAPath
、sslCert
、sslVerify
等