Pular para o conteúdo
ecdsa.com
git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)Git

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

Como corrigir

  1. 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. 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. 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. 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. 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

Ver toda a base de erros de assinatura