Aller au contenu
ecdsa.com
git over HTTPS with libcurl-gnutls (Debian, Ubuntu)Git

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

Comment corriger l’erreur

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

Parcourir toute la base de données des erreurs de signature