Mensagem de erro
fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificate problem: unable to get local issuer certificate
Também aparece como
- fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificate OpenSSL verify result: unable to get local issuer certificate (20)
A URL é o seu remoto. Com a libcurl 8.22 (e possivelmente outras versões recentes), o motivo aparece como “SSL certificate OpenSSL verify result: unable to get local issuer certificate (20)”. Já os builds do git no Debian e no Ubuntu usam GnuTLS e, em vez disso, imprimem “server verification failed: certificate signer not trusted”.
O que significa
O transporte HTTPS do git usa a libcurl, e a libcurl com OpenSSL não encontrou a CA que emitiu o último certificado enviado pelo servidor Git. Ou o servidor deixa de enviar o intermediário, ou a cadeia termina em uma raiz (CA da empresa, CA do proxy) que não está no bundle que o git usa. No Windows, esse é o sintoma clássico do Git for Windows fazendo a verificação com o próprio arquivo de CAs embutido, em vez do repositório de certificados do Windows.
Por que acontece
O Git for Windows consulta o próprio arquivo de CAs, e não o repositório do Windows
comumCom o backend OpenSSL padrão, o Git for Windows faz a verificação com o ca-bundle.crt que vem com ele. As raízes da empresa e de proxies que a TI distribui no repositório de certificados do Windows não estão nesse arquivo, por isso os clones falham enquanto os navegadores funcionam.
Um servidor Git auto-hospedado com CA privada
comumInstalações do GitLab, Gitea, Bitbucket Data Center ou Azure DevOps Server costumam usar certificados de uma CA interna em que as imagens de CI e as máquinas novas não confiam.
O servidor omite o certificado intermediário
ocasionalSe o emissor citado for um intermediário público, o servidor Git ou o proxy reverso dele está configurado só com o certificado folha.
Uma configuração http.sslCAInfo ou GIT_SSL_CAINFO substitui o bundle
ocasionalUm arquivo de CA definido para um único host interno, mas configurado globalmente, substitui o bundle padrão para todos os remotos, e os hosts públicos passam a falhar (ou o contrário, depois que o arquivo foi movido).
Como corrigir
- 1.
Windows: fazer o git usar o repositório de certificados do Windows
Com http.sslBackend schannel, o Git for Windows faz a verificação pelo próprio Windows e aceita todas as raízes em que o Windows confia, inclusive as distribuídas por política de grupo. Essa é a correção limpa para redes corporativas.
bash # Git for Windows: verify with the Windows certificate store, where IT deploys company roots git config --global http.sslBackend schannel git config --global --get http.sslBackend - 2.
Confiar na CA para um único host Git
Um http.<url>.sslCAInfo restrito a uma URL adiciona a CA privada só para aquele host; o GIT_SSL_CAINFO vale para um único comando ou job.
bash git config --global http."https://git.example.com/".sslCAInfo /etc/ssl/private-ca/corp-root-ca.pem # one command or CI job only GIT_SSL_CAINFO=/etc/ssl/private-ca/corp-root-ca.pem git clone https://git.example.com/team/app.git - 3.
Instalar a raiz no bundle do sistema
No Linux, a libcurl lê por padrão o bundle do sistema, então adicionar a raiz ali corrige o git junto com o curl e os gerenciadores de pacotes.
bash # Alpine / Debian / Ubuntu cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && update-ca-certificates # RHEL / Fedora cp corp-root-ca.pem /etc/pki/ca-trust/source/anchors/ && update-ca-trust - 4.
Procurar uma configuração que substitua o bundle
O --show-origin mostra qual arquivo de configuração define um caminho de CA. Remova as configurações globais que deveriam valer só para um host.
bash git config --show-origin --get-all http.sslCAInfo git config --show-origin --get-regexp 'http\..*\.sslcainfo' env | grep -E 'GIT_SSL_CAINFO|CURL_CA_BUNDLE|SSL_CERT_FILE' - 5.
Diagnóstico temporário: pular a verificação em um único comando
Use -c http.sslVerify=false só para confirmar o diagnóstico, nunca na configuração global: isso expõe credenciais e permite que qualquer um no caminho altere o código que você baixa.
bash # Diagnostic only, for one command git -c http.sslVerify=false ls-remote https://git.example.com/team/app.git
Erros relacionados
fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificat…git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)fatal: unable to access 'https://git.example.com/team/app.git/': server verific…git over HTTPS with libcurl-gnutls (Debian, Ubuntu)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)