Ubuntu服务器本机git访问GitBucket时出现SSL证书验证失败报错
根本原因
- 证书链优先匹配逻辑异常:你当前Apache配置的是Let's Encrypt默认的兼容型证书链,包含交叉签名到已过期DST Root CA X3的中间证书。Ubuntu 20.04默认系统信任库中,如果未主动禁用过期的DST Root CA X3,本地Git底层依赖的SSL库会优先匹配到这条过期根证书链,直接导致验证失败。其他外部客户端要么已从信任库移除过期DST根证书,要么内置了ISRG Root X1根证书并优先匹配有效链,因此访问不受影响。
- 访问地址与证书主体不匹配:你本机使用局域网IP访问服务,而Let's Encrypt不会为局域网IP颁发证书,你的证书实际签给对应公网域名。如果外部客户端均使用域名访问,自然不会触发域名不匹配校验,而本机用IP访问时会叠加触发验证失败,你临时使用的
http.sslVerify=false参数同时绕过了证书有效期和域名匹配两层校验,所以可以临时生效。 - Git自定义信任库配置优先级更高:Git默认会优先读取全局/仓库级配置的
http.sslCAInfo指定的CA文件,优先级高于系统信任库。如果你的Git全局配置指向了旧的、未更新的CA文件,即便更新系统信任库也不会生效。
排查步骤
- 检查Git的SSL配置:执行
git config --list --global | grep http.ssl,确认是否存在自定义的http.sslCAInfo、http.sslCAPath配置,如果有可以先删除该配置,或更新对应CA文件。 - 验证系统信任库的DST根证书状态:执行
trust list | grep "DST Root CA X3",如果输出中存在label: DST Root CA X3且无disabled标记,说明该过期根证书仍在系统信任列表中。 - 用curl直接测试定位具体错误:执行
curl -v https://192.168.xxx.xxx/repourl/,根据返回的SSL错误信息可以直接判定是证书过期还是域名不匹配问题。 - 检查Apache的证书链配置:确认Apache配置的证书链文件类型,Let's Encrypt生成的证书目录下存在两种链:默认的
fullchain.pem是兼容老Android的DST交叉签名链,alternate/fullchain.pem是仅到ISRG Root X1的短有效链。
永久解决方案
- 禁用系统信任库中的过期DST根证书
执行命令:
在弹出的配置界面中找到sudo dpkg-reconfigure ca-certificatesDST_Root_CA_X3.crt,取消其勾选,确认后更新系统信任库即可。 - 切换Apache使用短有效证书链
将Apache配置中的证书链文件替换为Let's Encrypt生成的alternate/fullchain.pem,重启Apache服务后,服务端仅返回到ISRG Root X1的有效链,彻底避免客户端匹配到过期根证书。 - 本机切换为域名访问
在服务器本机的/etc/hosts文件中添加记录127.0.0.1 你的GitBucket服务域名,后续本机访问Git仓库时使用域名而非局域网IP,即可解决证书域名不匹配问题。
内容的提问来源于stack exchange,提问作者codeling
相关产品推荐
相关产品推荐

