Git-Fehler: "Überprüfung des Hostschlüssels fehlgeschlagen" beim Herstellen einer Verbindung zum Remote-Repository

220

Ich versuche, eine Verbindung zu einem Remote-Git-Repository herzustellen, das sich auf meinem Webserver befindet, und es auf meinen Computer zu klonen.

Ich verwende das folgende Format für meinen Befehl:

git clone ssh://[email protected]/repository.git

Dies hat für die meisten meiner Teammitglieder gut funktioniert. Normalerweise fordert Git nach dem Ausführen dieses Befehls zur Eingabe des Benutzerpassworts auf und führt dann das Klonen aus. Wenn ich jedoch auf einem meiner Computer laufe, wird folgende Fehlermeldung angezeigt:

Überprüfung des Hostschlüssels fehlgeschlagen.

fatal: Konnte nicht aus dem Remote-Repository lesen.

Wir verwenden keine SSH-Schlüssel, um eine Verbindung zu diesem Repository herzustellen. Daher bin ich mir nicht sicher, warum Git auf diesem bestimmten Computer nach einem sucht.

Bootsz
quelle
1
Sie werden unter Verwendung von SSH zu diesem Repository zu verbinden, Hinweis , wie Sie Ihre URL beginnt mitssh://
Brandon
Ich habe ein ähnliches Problem . Kann mir bitte jemand helfen? Ich stecke fest :(
SepSol

Antworten:

163

Sie stellen eine Verbindung über das SSH-Protokoll her, wie durch das ssh://Präfix auf Ihrer Klon-URL angegeben. Bei Verwendung von SSH hat jeder Host einen Schlüssel. Clients merken sich den einer bestimmten Adresse zugeordneten Hostschlüssel und lehnen die Verbindung ab, wenn sich ein Hostschlüssel zu ändern scheint. Dies verhindert, dass der Mensch in der Mitte angreift.

Der Hostschlüssel für domain.com hat sich geändert. Wenn Ihnen dies nicht${HOME}/.ssh/known_hosts faul erscheint , entfernen Sie den alten Schlüssel aus Ihrem lokalen Cache, indem Sie ihn bearbeiten , um die Zeile für domain.com zu entfernen, oder ein SSH-Dienstprogramm dies für Sie tun lassen

ssh-keygen -R domain.com

Notieren Sie von hier aus den aktualisierten Schlüssel, indem Sie ihn selbst ausführen

ssh-keyscan -t rsa domain.com >> ~/.ssh/known_hosts

oder äquivalent, lassen Sie sshes für Sie tun nächste Verbindung mit git fetch, git pulloder git push(oder sogar ein einfaches ol ssh domain.com) durch die Beantwortung ja , wenn Sie dazu aufgefordert

Die Authentizität des Hosts 'domain.com (abcd)' kann nicht festgestellt werden.
Der Fingerabdruck des RSA-Schlüssels lautet XX: XX: ...: XX.
Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (Ja / Nein)?

Der Grund für diese Eingabeaufforderung ist, dass sich domain.com known_hostsnach dem Löschen nicht mehr in Ihrem befindet und vermutlich nicht mehr im System. Sie /etc/ssh/ssh_known_hostskönnen also sshnicht feststellen, ob der Host am anderen Ende der Verbindung wirklich domain.com ist. (Wenn der falsche Schlüssel eingegeben wird /etc, muss jemand mit Administratorrechten die systemweite Datei aktualisieren.)

Ich empfehle Ihnen dringend, die Authentifizierung von Benutzern auch mit Schlüsseln in Betracht zu ziehen. Auf diese Weise ssh-agentkönnen wichtige Informationen bequem gespeichert werden (anstatt dass jeder sein Kennwort für jede Verbindung zum Server eingeben muss), und Kennwörter werden nicht über das Netzwerk übertragen.

Greg Bacon
quelle
3
Unterhaltsame Tatsache, das Ausführen sudo ssh-keygen -R domain.comkann Ihre vorhandene known_hostsDatei umbenennen known_hosts.oldund eine Kopie erstellen , die nur von root gelesen werden kann . ( -rw------- root root) Sie können dies problemlos chownan den entsprechenden Benutzer zurückgeben, aber Sie könnten auch einen Nachmittag damit verschwenden, zu debuggen, warum Git kaputt ist. : D
Andrew Rueckert
1
Are you sure you want to continue connecting (yes/no)?. Mach nicht den gleichen Fehler wie ich. Sie müssen eingeben yes.
Wenn Sie
304

Wie ich zuvor in Cloning git repo geantwortet habe, verursacht dies einen Fehler - Die Überprüfung des Hostschlüssels ist fehlgeschlagen. fatal: Das Remote-Ende hat unerwartet aufgelegt. Fügen Sie den GitHub zur Liste der autorisierten Hosts hinzu:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

Tupy
quelle
3
Dies ist der sicherste Weg, ohne dass der Schlüssel bereits vorhanden ist. Dies setzt voraus, dass Sie es nur einmal ausführen, nicht jedes Mal, wenn Sie eine Verbindung zum Server herstellen.
Zenexer
Das private Fit-Repository meines Unternehmens verwendet ecdsa als Schlüssel. Wenn die Lösung also nicht funktioniert, liegt dies möglicherweise daran, dass der Algorithmus nicht korrekt ist
Fendy,
8
Dies sollte die akzeptierte Antwort sein. Danke, dass du meinen Tag gerettet hast.
Keyur
Ich habe mich auch gefragt, warum ich mein eigenes Repo nicht klonen konnte
StackAttack
Jemand hat diesen Beitrag markiert (falsch). Aus der Überprüfung .
Wai Ha Lee
55

Ich hatte das ähnliche Problem, aber mit SSH-Schlüsseln. Aus der obigen Antwort von Tupy habe ich herausgefunden, dass das Problem darin besteht, dass die Datei unknown_hosts nicht vorhanden ist oder github.com nicht in der Liste der bekannten Hosts vorhanden ist. Hier sind die Schritte, die ich befolgt habe, um das Problem zu beheben:

  1. mkdir -p ~/.ssh
  2. ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  3. ssh-keygen -t rsa -C "user.email"
  4. Öffnen Sie den öffentlichen Schlüssel mit diesem Befehl $ cat ~/.ssh/id_rsa.pub und kopieren Sie ihn.
  5. Fügen Sie den Schlüssel id_rsa.pub zur Liste der SSH-Schlüssel in Ihrem GitHub-Profil hinzu.
Saran
quelle
1
@OJFord FYI: Ich habe die ursprüngliche Antwort so bearbeitet, dass Ihr Kommentar überholt ist. TBH und bei allem Respekt war es überhaupt nicht ganz richtig. Der touchBefehl ~/.sshschlägt fehl, falls das Verzeichnis nicht vorhanden ist. Daher war Schritt 1 weiterhin erforderlich. Außerdem müssen Sie touchdie Datei nicht verwenden, bevor Sie die >>Umleitung verwenden. Es wird bei Bedarf erstellt (aber nur die Datei, nicht der gesamte Pfad, wird also noch mkdir -pbenötigt). Mit dieser -pOption funktioniert es, falls das Verzeichnis bereits vorhanden ist.
Tad Lispy
1
Es ist die Nummer 2 ssh-keyscan, die in den Github-Dokumenten beim Hinzufügen eines neuen SSH-Schlüssels fehlt.
Phil Andrews
1
Ich hatte Probleme mit meiner Dockerfilemangelnden Erlaubnis. Das Hinzufügen des zweiten Schritts hier hat dieses Problem behoben! Vielen Dank für die großartige Arbeit
Spencer Pollock
37

Dies geschieht, weil sich Github derzeit nicht in Ihren bekannten Hosts befindet.

Sie sollten aufgefordert werden, Ihren bekannten Hosts Github hinzuzufügen. Wenn dies nicht geschehen ist, können Sie ssh -T [email protected]die Eingabeaufforderung erneut ausführen .

Powderham
quelle
2
Dies ist die richtige Antwort, wenn Sie nie dazu aufgefordert werden.
Matthias Hagemann
15

Für mich musste ich nur "Ja" an der Eingabeaufforderung eingeben, die fragt "Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (Ja / Nein)?" anstatt nur die Eingabetaste zu drücken.

Code-Lehrling
quelle
Diese Antwort führte mich zu der Erkenntnis, dass ich mein Repo manuell auf meinen Build-Server klonen musste, um 'yes' einzugeben und meinen Bitbucket-Server
Sashah
1
@Sashah Wenn Sie nur den Bitbucket-Server in unknown_hosts benötigen, können Sie die Datei manuell bearbeiten. Das Repo muss nicht geklont werden, wenn dies der einzige Grund dafür ist.
Code-Apprentice
7

Ich habe das gleiche Problem auf einem neu installierten System, aber dies war ein udev-Problem. Da es keinen /dev/ttyKnoten gab, musste ich Folgendes tun:

mknod -m 666 /dev/tty c 5 0
Geoffroy
quelle
1
Es hat bei mir funktioniert, weil / dev / tty als Datei erstellt wurde, sehr seltsam! (Also musst du es entfernen und dann mit mknod neu erstellen)
Doomsday
@Geoffroy, ich habe / dev / tty entfernt und jetzt, wenn ich sudo mache, sehe ich diesen Fehler: sudo: Entschuldigung, Sie müssen ein tty haben, um sudo
Milad
@ xe4me Ich habe nie gesagt, dass Sie es entfernen sollten, je nach dem System, das es tatsächlich benötigt. Ein Neustart sollte das Problem beheben.
Geoffroy
@Geoffroy, eigentlich der erste Kommentator, sagte, ich müsse entfernen und neu erstellen: d Nein, ein Neustart hat nicht funktioniert, ich musste der Wurzel sagen, er hat es behoben: d
Milad
6

Wenn Sie sich im Office-Intranet befinden (ansonsten gefährlich), das immer durch Firewalls geschützt ist, haben Sie einfach die folgenden Zeilen in Ihrer ~ / .ssh / config

Host *
StrictHostKeyChecking no
UserKnownHostsFile = / dev / null

sunil
quelle
2
Dies ist bei unseren Firewalls ohne Unternehmen immer noch gefährlich. Woher wissen Sie, dass Sie mit dem echten Github sprechen, ohne den Serverschlüssel zu überprüfen?
Mnebuerquo
1
In Unternehmensumgebungen werden meistens lokale Git-Repos verwendet, niemals OpenSource-Repos. Im schlimmsten Fall kann die .ssh-Konfiguration oben in der Datei explizite hostbezogene Konfigurationszeilen für gshub enthalten, damit ssh spezifischere Übereinstimmungen auswählt.
Sunil
5

Was für mich funktioniert hat, war, zuerst meinen SSH-Schlüssel des neuen Computers hinzuzufügen. Ich habe diese Anweisungen von GitLab befolgt - SSH-Schlüssel hinzufügen . . Da ich unter Win10 bin, musste ich alle diese Befehle in Git Bash unter Windows ausführen (es funktionierte nicht in der regulären DOS-Cmd-Shell).

Andererseits musste ich in Git Bash ein git cloneRepo machen, mit dem ich Probleme hatte, und in meinem Fall musste ich es auf einen anderen Namen klonen, da ich es bereits lokal hatte und meine Commits nicht verlieren wollte. Beispielsweise

git clone ssh://git@gitServerUrl/myRepo.git myRepo2

Dann bekam ich die Aufforderung, es zur Liste der bekannten Hosts hinzuzufügen. Die Frage könnte folgende sein:

Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (Ja / Nein)?

Ich habe "Ja" eingegeben und es hat endlich funktioniert. Normalerweise sollten Sie eine ähnliche Nachricht erhalten:

Warnung: '[Ihr Repo-Link]' (ECDSA) wurde dauerhaft zur Liste der bekannten Hosts hinzugefügt.

Hinweis : Wenn Sie unter Windows arbeiten, stellen Sie sicher, dass Sie Git Bash für alle Befehle verwenden. Dies funktionierte nicht in der regulären Cmd-Shell oder Powershell. Ich musste dies wirklich in Git Bash tun.

Zuletzt habe ich das zweite Klon-Repo ( myRepo2im Beispiel) gelöscht und bin zu meinem ersten Repo zurückgekehrt, und ich konnte endlich alle Git-Sachen wie gewohnt in meinem Lieblingseditor VSCode machen.

Ghiscoding
quelle
In der Tat sieht meine Cygwin-Eingabeaufforderung fast genauso aus wie meine Git-Bash-Eingabeaufforderung, funktioniert jedoch nur in der Git-Bash-Eingabeaufforderung!
Josiah Yoder
3

Wenn Sie Git für Windows verwenden.

  • Öffnen Sie die Git-GUI.
  • Öffnen Sie das lokale Git-Repository in der Git-GUI.
  • Fügen Sie die Fernbedienung hinzu oder drücken Sie, wenn die Fernbedienung bereits vorhanden ist.
  • Beantworten Sie die Frage, ob Sie fortfahren möchten, mit "Ja".

Der GUI-Client fügt den Schlüssel für Sie hinzu ~/.ssh/known_hosts. Dies ist leichter zu merken, wenn Sie es nicht oft tun, und vermeidet auch die Verwendung der Git-Befehlszeile (die Standard-Windows-Befehlszeilen enthalten keine ssh-keyscanausführbare Datei.

Julian Knight
quelle
2

Wenn der Remote-Server eine Verbindung zum privaten Repo herstellen möchte, wird er über ssh authentifiziert. Erstellen Sie das privat-öffentliche Schlüsselpaar mit ssh-keygen oder wenn Sie bereits über den öffentlich-privaten Schlüssel verfügen. Kopieren Sie den öffentlichen Schlüssel und fügen Sie ihn in die Einstellungen des privaten Repos ein.

YourPrivateRepo -> Einstellungen -> Bereitstellungsschlüssel -> Bereitstellungsschlüssel hinzufügen -> Fügen Sie den öffentlichen Schlüssel ein.

Jetzt kann der Remote-Server eine Verbindung zum privaten Repo herstellen.

HINWEIS: Die Bereitstellungsschlüssel haben nur Zugriff zum Lesen des Repos. Schreibzugriff muss explizit zugelassen werden.

Sandig
quelle
1

Dies bedeutet, dass Ihr Remote-Host-Schlüssel geändert wurde (möglicherweise eine Änderung des Host-Passworts).

Ihr Terminal hat vorgeschlagen, diesen Befehl als Root-Benutzer auszuführen

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]

Sie müssen diesen Hostnamen aus der Hostliste auf Ihrem PC / Server entfernen. Kopieren Sie den vorgeschlagenen Befehl und führen Sie ihn als Root-Benutzer aus.

$ sudo su                                                        // Login as a root user

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]    // Terminal suggested command execute here
Host [www.website.net]:4231 found: line 16 type ECDSA
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

$ exit                                                           // Exist from root user

Versuchen Sie es erneut. Ich hoffe, das funktioniert.

Jay Patel
quelle
Hinweis: Abhängig von Ihrer Shell müssen Sie möglicherweise die eckigen Klammern \ [und \] maskieren oder Anführungszeichen verwenden.
Phlarx
1

Auf die Frage:

Are you sure you want to continue connecting (yes/no)?

Typ ja als Antwort

So habe ich mein Problem gelöst. Aber wenn Sie versuchen, nur die Eingabetaste zu drücken, funktioniert es nicht!

Shutsuke
quelle
0

Sie können Ihre "Git-URL" im URL-Format "https" in der Jenkins-Datei oder wo immer Sie möchten verwenden.

git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'

Nitin
quelle
0

Ich hatte den gleichen Fehler in DockerFile während der Erstellungszeit, während das Image öffentlich war. Ich habe in Dockerfile wenig Änderungen vorgenommen.

 RUN git clone  https://github.com/kacole2/express-node-mongo-skeleton.git /www/nodejs

Dies liegt daran, dass die Verwendung der Syntax [email protected]: ... dazu führt, dass SSH zum Klonen verwendet wird und Ihr privater Schlüssel im Container nicht verfügbar ist. Sie möchten stattdessen den RUN-Git-Klon> https://github.com/edenhill/librdkafka.git verwenden.

Adiii
quelle
-1

Ich hatte das ähnliche Problem, leider habe ich das GitExtensions HMI verwendet und vergessen, dass ich eine Passphrase geschrieben habe. Mit HMI .... vergiss es! Geben Sie keine Passphrase ein, wenn Sie Ihren Schlüssel generieren!

Jerome Vacher
quelle
-4

Ich habe diese Nachricht erhalten, als ich versucht habe, git cloneein Repo zu machen, das nicht meins war. Die Lösung bestand darin, zu gabeln und dann zu klonen.

fyodrs
quelle