遇到Git操作时的SSL证书错误就像快递员找不到你家门牌号——明明地址正确却无法正常送达代码。作为每天要处理几十次仓库同步的开发者,我总结出这套覆盖90%以上场景的标准化排查方案。
典型报错:
code复制fatal: unable to access 'https://example.com/repo.git/': SSL certificate problem: unable to get local issuer certificate
常发生在:
code复制SSL: certificate subject name 'git.company.com' does not match target host name 'code.company.com'
多出现在:
code复制error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
主要由以下情况触发:
bash复制openssl s_client -connect git.example.com:443 -servername git.example.com -showcerts
关键输出解读:
Verify return code:0 表示证书验证通过Not Before/Not After时间范围bash复制curl -vI https://git.example.com
优势:
--cacert指定证书文件bash复制git config --global http.sslVerify false
警告:此操作会降低安全性,仅限临时排查使用
bash复制git config --global http.sslCAInfo /path/to/cert.pem
证书获取方式:
ini复制[http]
sslVersion = tlsv1
支持的值:
Linux系统:
bash复制# Ubuntu/Debian
sudo update-ca-certificates --fresh
# RHEL/CentOS
sudo update-ca-trust
Windows系统:
certmgr.msc在.gitconfig中配置:
ini复制[http]
proxy = http://proxy.example.com:8080
sslVerify = true
sslCAInfo = /path/to/proxy-cert.pem
现象:
code复制SSL certificate problem: self signed certificate
解决步骤:
bash复制openssl s_client -connect git.internal:443 2>&1 | sed -n '/-----BEGIN/,/-----END/p' > git.internal.crt
bash复制git config --global http.sslCAInfo /path/to/git.internal.crt
错误信息:
code复制certificate has expired
处理方案:
bash复制# 检查系统时间
date
# 更新CA存储(Linux示例)
sudo apt install ca-certificates --upgrade
bash复制echo | openssl s_client -connect git.example.com:443 2>/dev/null | openssl x509 -fingerprint -noout
比对输出与管理员提供的SHA256指纹
ini复制[http "https://specific.git.example.com"]
sslCAInfo = /path/to/specific.crt
优于全局配置,避免过度信任
版本要求:
升级命令:
bash复制# Ubuntu示例
sudo add-apt-repository ppa:git-core/ppa
sudo apt update && sudo apt install git
/etc/ssl/certsC:\Program Files\Git\mingw64\ssl\certs/usr/local/etc/openssl/cert.pembash复制GIT_CURL_VERBOSE=1 GIT_TRACE=2 git clone https://example.com/repo.git
日志关键字段:
CAfile: 显示加载的证书路径SSL connection using: 显示协商的协议版本server certificate verification: 验证结果bash复制openssl s_client -connect git.example.com:443 2>&1 | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}'
for cert in *.pem; do
openssl x509 -in $cert -text -noout | grep -E 'Subject:|Issuer:'
done
创建.gitcerts目录:
code复制├── company-root.crt
├── git-server.crt
└── config.ini
配置内容:
ini复制[http]
sslCAInfo = ~/.gitcerts/company-root.crt
bash复制#!/bin/bash
CERT_DIR="$HOME/.gitcerts"
mkdir -p "$CERT_DIR"
curl -sSfL https://internal.corp/certs/root.crt -o "$CERT_DIR/company-root.crt"
git config --global http.sslCAInfo "$CERT_DIR/company-root.crt"
需配置IAM证书:
ini复制[http "https://git-codecommit.*.amazonaws.com"]
sslCAInfo = /usr/share/ca-certificates/aws/AWSCodeCommit.crt
证书自动更新方案:
powershell复制Start-BitsTransfer -Source "https://dev.azure.com/certs/CA.cer" -Destination "$env:USERPROFILE\.gitcerts\azure.cer"
certutil -addstore -user Root "$env:USERPROFILE\.gitcerts\azure.cer"
dockerfile复制FROM alpine/git
COPY company-ca.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates
groovy复制pipeline {
agent any
environment {
GIT_SSL_CAINFO = "${WORKSPACE}/certs/company.crt"
}
stages {
stage('Checkout') {
steps {
sh 'git config --global http.sslCAInfo ${GIT_SSL_CAINFO}'
}
}
}
}