Saltar al contenido
ecdsa.com
git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)Git

Mensaje de error

fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificate problem: unable to get local issuer certificate

También se muestra como

  • fatal: unable to access 'https://git.example.com/team/app.git/': SSL certificate OpenSSL verify result: unable to get local issuer certificate (20)

La URL es la de tu remoto. Con libcurl 8.22 (y posiblemente otras versiones recientes), el motivo dice «SSL certificate OpenSSL verify result: unable to get local issuer certificate (20)». Las compilaciones de git de Debian y Ubuntu usan GnuTLS y, en su lugar, imprimen «server verification failed: certificate signer not trusted».

Qué significa

El transporte HTTPS de git usa libcurl, y libcurl con OpenSSL no encontró la CA que emitió el último certificado que envió el servidor Git. O bien el servidor omite su intermedio, o bien la cadena termina en una raíz (la CA de la empresa, la CA del proxy) que no está en el bundle que usa git. En Windows es el síntoma clásico de que Git for Windows verifica con su propio archivo de CA incluido en lugar de usar el almacén de certificados de Windows.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Windows: cambiar git al almacén de certificados de Windows

    Con http.sslBackend schannel, Git for Windows verifica a través del propio Windows y acepta todas las raíces en las que confía Windows, incluidas las desplegadas mediante la política de grupo. Es la solución limpia para las 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 en la CA para un solo host de Git

    Un http.<url>.sslCAInfo limitado a una URL añade la CA privada solo para ese host; GIT_SSL_CAINFO se aplica a un solo comando o trabajo.

    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 la raíz en el bundle del sistema

    En Linux, libcurl lee de forma predeterminada el bundle del sistema, así que añadir ahí la raíz corrige git junto con curl y los gestores de paquetes.

    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.

    Buscar un ajuste que sustituya el bundle

    --show-origin indica qué archivo de configuración establece una ruta de CA. Elimina los ajustes globales que deberían haberse limitado a un 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 temporal: omitir la verificación en un solo comando

    Usa -c http.sslVerify=false solo para confirmar el diagnóstico, nunca en la configuración global: expone las credenciales y permite que cualquiera que esté en la ruta de red modifique el código que descargas.

    bash
    # Diagnostic only, for one command
    git -c http.sslVerify=false ls-remote https://git.example.com/team/app.git

Errores relacionados

Explorar toda la base de datos de errores de firma