Zum Inhalt springen
ecdsa.com
git over HTTPS with libcurl-gnutls (Debian, Ubuntu)Git

Fehlermeldung

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)

Auch ausgegeben als

  • server verification failed: certificate signer not trusted. (CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none)
  • server certificate verification failed. CAfile: none CRLfile: none

Die URL ist dein Remote. Ältere Releases von Debian und Ubuntu (libcurl 7.x) geben die kürzere Form „server certificate verification failed. CAfile: none CRLfile: none“ aus; „CAfile: none“ bedeutet dabei nur, dass keine CA-Datei explizit konfiguriert und das System-Bundle verwendet wurde.

Was der Fehler bedeutet

Der HTTPS-Transport von git (unter Debian und Ubuntu libcurl, gegen GnuTLS gebaut) konnte das Zertifikat des Git-Servers nicht prüfen: Kein Zertifikat in der Kette führt zu einer CA in dem Bundle, das er liest. Mit „certificate signer not trusted“ meldet GnuTLS, dass der Aussteller unbekannt ist; deine Zugangsdaten oder das Repository wurden noch gar nicht geprüft.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Nachsehen, welche Zertifikate der Git-Server sendet

    Erscheint nur das Leaf-Zertifikat, korrigiere den Server. Endet die Kette bei einem Root-Zertifikat des Unternehmens oder des Proxys, installiere dieses Root-Zertifikat auf dem 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.

    Einer CA für einen einzelnen Git-Server vertrauen

    http.<url>.sslCAInfo beschränkt die eigene CA auf einen Host, sodass öffentliche Remotes weiter das System-Bundle verwenden. GIT_SSL_CAINFO leistet dasselbe für einen einzelnen Befehl oder CI-Job.

    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.

    Root-Zertifikat zum System-Bundle hinzufügen

    Ein über update-ca-certificates installiertes Root-Zertifikat behebt das Problem für git, curl, wget und Paketmanager in einem Schritt. In Docker-Images erledigst du das im Dockerfile, in der CI im Runner-Image.

    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.

    Eigener Server: vollständige Kette konfigurieren

    Die Zertifikatsdatei, die das Web-Frontend des Git-Servers verwendet, muss das Leaf-Zertifikat und danach jedes Zwischenzertifikat enthalten.

    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.

    Vorübergehende Diagnose: Prüfung für einen einzelnen Befehl überspringen

    -c http.sslVerify=false für einen einzelnen Befehl bestätigt, dass ausschließlich das Vertrauen das Problem ist. Setzt du es global, gehen deine Zugangsdaten und dein Code an jeden, der die Verbindung abfangen kann.

    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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen