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
Git for Windows comprueba su propio archivo de CA, no el almacén de Windows
frecuenteCon el backend OpenSSL predeterminado, Git for Windows verifica con el ca-bundle.crt que trae consigo. Las raíces de la empresa y del proxy que el departamento de TI despliega en el almacén de certificados de Windows no están en ese archivo, así que la clonación falla mientras que los navegadores funcionan.
Un servidor Git autoalojado con una CA privada
frecuenteLas instalaciones de GitLab, Gitea, Bitbucket Data Center o Azure DevOps Server suelen usar certificados de una CA interna en la que no confían las imágenes de CI ni los equipos nuevos.
El servidor omite su certificado intermedio
ocasionalSi el emisor citado es un intermedio público, el servidor Git o su proxy inverso está configurado solo con el certificado hoja.
Un http.sslCAInfo o GIT_SSL_CAINFO personalizado sustituye el bundle
ocasionalUn archivo de CA pensado para un host interno pero configurado de forma global sustituye el bundle predeterminado para todos los remotos, así que los hosts públicos empiezan a fallar (o al revés, después de mover el archivo).
Cómo solucionarlo
- 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.
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.
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.
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.
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
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)