Message d’erreur
fatal: unable to access 'https://git.example.com/team/app.git/': server verification failed: certificate signer not trusted. (CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none)
Également affiché sous la forme
- server verification failed: certificate signer not trusted. (CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none)
- server certificate verification failed. CAfile: none CRLfile: none
L’URL est celle de votre dépôt distant. Les versions plus anciennes de Debian et d’Ubuntu (libcurl 7.x) affichent le message plus court « server certificate verification failed. CAfile: none CRLfile: none », où « CAfile: none » signifie seulement qu’aucun fichier d’AC explicite n’a été configuré et que le fichier d’AC du système a été utilisé.
Ce que cela signifie
Le transport HTTPS de git (libcurl compilé avec GnuTLS sous Debian et Ubuntu) n’a pas pu vérifier le certificat du serveur Git : aucun certificat de la chaîne ne mène à une AC présente dans le fichier d’AC qu’il lit. « certificate signer not trusted » est la façon dont GnuTLS indique que l’émetteur est inconnu ; ni vos identifiants ni le dépôt n’ont encore été vérifiés.
Pourquoi cela se produit
GitLab, Gitea ou Bitbucket auto-hébergé avec un certificat d’entreprise
fréquenteLes serveurs Git auto-hébergés reçoivent souvent leurs certificats d’une AC interne. Les portables des développeurs disposent de cette racine grâce à la gestion des appareils ; les conteneurs Linux, les runners de CI et les distributions WSL, en général, non.
Le serveur Git n’envoie pas son certificat intermédiaire
fréquenteGitLab, Gitea et les proxys inverses placés devant eux sont souvent configurés avec le seul certificat feuille. Les navigateurs comblent le manque, GnuTLS non.
Un proxy d’inspection TLS se trouve entre vous et l’hôte Git
occasionnelleLes clones depuis github.com ou gitlab.com qui n’échouent que sur le réseau de l’entreprise passent par un proxy qui re-signe le trafic et dont la racine manque dans le fichier d’AC de la machine.
L’image n’a pas de fichier d’AC
occasionnelleUne image slim où git est installé, mais pas ca-certificates, échoue pour tous les dépôts distants HTTPS.
Comment corriger l’erreur
- 1.
Voir quels certificats envoie le serveur Git
Si seul le certificat feuille apparaît, corrigez le serveur. Si la chaîne se termine par une racine d’entreprise ou de proxy, installez cette racine sur le client.
bash openssl s_client -connect git.example.com:443 -servername git.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Faire confiance à une AC pour un seul serveur Git
http.<url>.sslCAInfo limite l’AC personnalisée à un seul hôte : les dépôts distants publics continuent donc d’utiliser le fichier d’AC du système. GIT_SSL_CAINFO fait de même pour une seule commande ou un seul job de CI.
bash # Trust the company CA for this server only; other remotes keep the system bundle git config --global http."https://git.example.com/".sslCAInfo /etc/ssl/private-ca/corp-root-ca.pem git ls-remote https://git.example.com/team/app.git - 3.
Ajouter la racine au fichier d’AC du système
Installer la racine avec update-ca-certificates corrige git, curl, wget et les gestionnaires de paquets en une seule opération. Dans les images Docker, faites-le dans le Dockerfile ; en CI, dans l’image du runner.
bash sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt sudo update-ca-certificates # git, curl and wget read /etc/ssl/certs/ca-certificates.crt - 4.
Propriétaires de serveurs : configurer la chaîne complète
Le fichier de certificat utilisé par le frontal web du serveur Git doit contenir le certificat feuille suivi de tous les certificats intermédiaires.
text # GitLab Omnibus (/etc/gitlab/gitlab.rb): the .crt file must contain leaf + intermediates nginx['ssl_certificate'] = "/etc/gitlab/ssl/git.example.com.crt" # then: sudo gitlab-ctl reconfigure - 5.
Diagnostic temporaire : désactiver la vérification pour une seule commande
-c http.sslVerify=false sur une seule commande confirme que la confiance est le seul problème. Le définir globalement envoie vos identifiants et votre code à quiconque peut intercepter la connexion.
bash # Diagnostic only, for one command: never set http.sslVerify=false globally git -c http.sslVerify=false ls-remote https://git.example.com/team/app.git
Erreurs associées
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/': SSL certificat…git over HTTPS with libcurl + OpenSSL (Git for Windows default, macOS Homebrew, Alpine, RHEL)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)ERROR: The certificate of 'api.example.com' is not trusted.GNU Wget built with GnuTLS (Debian, Ubuntu before 22.04 used it too)