Błąd Git: „Błąd weryfikacji klucza hosta nie powiódł się” podczas łączenia ze zdalnym repozytorium


222

Próbuję połączyć się ze zdalnym repozytorium Git, które znajduje się na moim serwerze internetowym i sklonować je na moim komputerze.

Używam następującego formatu dla mojej komendy:

git clone ssh://username@domain.com/repository.git

Działa to dobrze dla większości członków mojego zespołu. Zwykle po uruchomieniu tego polecenia Git wyświetli monit o podanie hasła użytkownika, a następnie uruchom klonowanie. Jednak podczas pracy na jednym z moich komputerów pojawia się następujący błąd:

Weryfikacja klucza hosta nie powiodła się.

fatal: Nie można odczytać ze zdalnego repozytorium.

Nie używamy kluczy SSH do łączenia się z tym repozytorium, więc nie jestem pewien, dlaczego Git szuka takiego na tym konkretnym komputerze.


1
Ci za pomocą protokołu SSH, aby połączyć się z tym repozytorium, informacja jak adres URL zaczyna się odssh://
Brandon

Mam podobny problem . Czy ktoś może mi pomóc proszę?
Utknąłem

Odpowiedzi:


164

Łączysz się za pomocą protokołu SSH, jak wskazano w ssh://prefiksie na sklonowanym adresie URL. Korzystając z SSH, każdy host ma klucz. Klienci zapamiętują klucz hosta powiązany z określonym adresem i odmawiają połączenia, jeśli klucz hosta wydaje się zmieniać. Zapobiega to atakom człowieka w środku.

Klucz hosta dla domeny.com zmienił się. Jeśli nie wydaje ci się to podejrzane , usuń stary klucz z lokalnej pamięci podręcznej, edytując, ${HOME}/.ssh/known_hostsaby usunąć wiersz dla domeny.com lub pozwalając narzędziu SSH zrobić to za Ciebie

ssh-keygen -R domain.com

Stąd zapisz zaktualizowany klucz, wykonując go samodzielnie

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

lub, równoważnie, niech sshzrobi to za ciebie następnym połączeniu z git fetch, git pulllub git push(albo nawet zwykły ol” ssh domain.com) odpowiadając Tak po pojawieniu się monitu

Nie można ustalić autentyczności hosta „domain.com (abcd)”.
Odcisk klucza RSA to XX: XX: ...: XX.
Czy na pewno chcesz kontynuować łączenie (tak / nie)?

Powodem tego monitu jest to, że domena.com nie jest już dostępna known_hostspo usunięciu i prawdopodobnie nie w systemie /etc/ssh/ssh_known_hosts, więc sshnie ma sposobu, aby dowiedzieć się, czy host na drugim końcu połączenia to tak naprawdę domena.com. (Jeśli wprowadzono niewłaściwy klucz /etc, osoba z uprawnieniami administratora będzie musiała zaktualizować plik ogólnosystemowy).

Gorąco zachęcam do rozważenia możliwości uwierzytelnienia użytkowników za pomocą kluczy. W ten sposób ssh-agentmożna przechowywać kluczowy materiał dla wygody (zamiast wszystkich osób, które muszą wprowadzać swoje hasło dla każdego połączenia z serwerem), a hasła nie są przesyłane przez sieć.


3
Ciekawostką jest, że bieganie sudo ssh-keygen -R domain.commoże zmienić nazwę istniejącego known_hostspliku known_hosts.oldi utworzyć kopię, którą będzie można odczytać tylko przez root . ( -rw------- root root) Możesz to łatwo chownprzywrócić do odpowiedniego użytkownika, ale możesz także zmarnować popołudniowe debugowanie, dlaczego git jest uszkodzony. : D
Andrew Rueckert

1
Are you sure you want to continue connecting (yes/no)?. Nie popełniaj tego samego błędu co ja. Musisz wpisać yes. Po prostu naciśnięcie
klawisza Enter

306

Jak już wcześniej odpowiedziałem w Klonowanie git repo powoduje błąd - weryfikacja klucza hosta nie powiodła się. fatal: Zdalny koniec nieoczekiwanie się rozłączył , dodaj GitHub do listy autoryzowanych hostów:

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


3
Jest to najbezpieczniejszy sposób, już nie posiadając klucza. Zakłada się, że uruchamiasz go tylko raz, a nie za każdym razem, gdy łączysz się z serwerem.
Zenexer,

Prywatne repozytorium fit mojej firmy używa ecdsa jako klucza, więc jeśli rozwiązanie nie działa, być może dlatego, że algorytm jest nieprawidłowy
Fendy

8
To powinna być zaakceptowana odpowiedź. Dzięki za uratowanie mi dnia.
Keyur,

też dla mnie zadziałało, zastanawiałem się, dlaczego nie mogłem sklonować własnego repozytorium
StackAttack,

Ktoś oznaczył ten post (niepoprawnie). Z recenzji .
Wai Ha Lee

55

Miałem podobny problem, ale używając kluczy SSH. Na podstawie powyższej odpowiedzi Tupy doszedłem do wniosku, że problem polega na tym, że plik znany_hosts nie jest obecny lub github.com nie jest obecny na liście znanych hostów. Oto kroki, które podjąłem, aby go rozwiązać -

  1. mkdir -p ~/.ssh
  2. ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  3. ssh-keygen -t rsa -C "user.email"
  4. otwórz klucz publiczny za pomocą tego polecenia $ cat ~/.ssh/id_rsa.pubi skopiuj go.
  5. Dodaj klucz id_rsa.pub do listy kluczy SSH w swoim profilu GitHub.

1
@OJFord FYI: Zredagowałem oryginalną odpowiedź w sposób, który sprawia, że ​​twój komentarz jest nieaktualny. TBH i z całym szacunkiem nie było to całkowicie poprawne. touchKomenda nie powiedzie się w przypadku ~/.sshkatalogu nie istnieje, więc nadal wymagane krok 1. Poza tym nie potrzebujesz touchpliku przed użyciem >>przekierowania. Zostanie utworzony, jeśli to konieczne (ale tylko plik, a nie cała ścieżka, więc nadal mkdir -pjest potrzebny). -pMake opcja to działa w przypadku katalog już istnieje.
Tad Lispy,

1
To nr 2, ssh-keyscanktórego brakuje w dokumentach Github po dodaniu nowego klucza ssh.
Phil Andrews,

1
Miałem problemy z Dockerfilebrakiem pozwolenia. Dodanie tutaj drugiego kroku rozwiązało ten problem! Dziękujemy za wspaniałą pracę
Spencer Pollock

37

Dzieje się tak, ponieważ github nie jest obecnie na twoich znanych hostach.

Powinien zostać wyświetlony monit o dodanie github do znanych hostów. Jeśli tak się nie stało, możesz uruchomić ponownie, ssh -T git@github.comaby otrzymać monit.


2
To właściwa odpowiedź, jeśli nigdy nie pojawi się monit.
Matthias Hagemann

15

Dla mnie po prostu musiałem wpisać „tak” w odpowiedzi na pytanie „Czy na pewno chcesz kontynuować łączenie (tak / nie)?” zamiast naciskać Enter.


Ta odpowiedź uświadomiła mi, że musiałem ręcznie sklonować moje repozytorium na moim serwerze kompilacji, aby wpisać „tak” i dodać mój serwer bitbucket do moich znanych
hostów

1
@Sashah Jeśli wszystko, czego potrzebujesz, to serwer bitbucket w znanych_hostach, możesz edytować plik ręcznie. Nie ma potrzeby klonowania repozytorium, jeśli jest to jedyny powód.
Code-Apprentice,

7

Mam ten sam problem w nowo zainstalowanym systemie, ale był to problem udev. Nie było /dev/ttywęzła, więc musiałem zrobić:

mknod -m 666 /dev/tty c 5 0

1
Działa to dla mnie, ponieważ / dev / tty został utworzony jako plik, bardzo dziwne! (więc musisz go usunąć, a następnie ponownie utworzyć za pomocą mknod)
Doomsday

@Geoffroy, usunąłem / dev / tty i teraz, kiedy robię sudo, napotykam ten błąd: sudo: przepraszam, musisz mieć tty, aby uruchomić sudo
Milad

@ xe4me Nigdy nie mówiłem, że powinieneś go usunąć, w zależności od systemu, który jest faktycznie wymagany. Uruchom ponownie powinien to naprawić.
Geoffroy,

@Geoffroy, właściwie pierwszy komentator, powiedział, że muszę usunąć i odtworzyć: d Nie, restartowanie nie zadziałało, musiałem powiedzieć rootowi, naprawił to: d
Milad

6

Jeśli korzystasz z biurowego intranetu (w innym przypadku niebezpiecznego), który jest zawsze chroniony przez zapory ogniowe, po prostu wpisz następujące wiersze w ~ / .ssh / config

Host *
StrictHostKeyChecking no
UserKnownHostsFile = / dev / null


2
Jest to nadal niebezpieczne, z naszymi bez korporacyjnych zapór ogniowych. Skąd wiesz, że rozmawiasz z prawdziwym githubem bez weryfikacji klucza serwera?
Mnebuerquo,

1
W środowiskach korporacyjnych najczęściej używane są lokalne repozytoria git, nigdy nie otwierające jednego. W najgorszym przypadku .ssh config w górnej części pliku może zawierać jawne wiersze konfiguracji związane z hostem github, aby ssh mógł wybrać bardziej szczegółowe dopasowania.
sunil

5

To, co zadziałało, to najpierw dodać mój klucz SSH do nowego komputera, postępowałem zgodnie z instrukcjami GitLab - dodaj klucz SSH . Zauważ, że skoro jestem na Win10, musiałem wykonać wszystkie te polecenia w Git Bash na Windowsie (nie działało to w zwykłej powłoce cmd DOS).

Z drugiej strony w Git Bash musiałem zrobić git clonerepozytorium, z którym miałem problemy, aw moim przypadku musiałem sklonować go pod inną nazwą, ponieważ miałem go już lokalnie i nie chciałem stracić swoich zobowiązań. Na przykład

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

Następnie dostałem monit o dodanie go do listy znanych hostów, pytanie może być następujące:

Czy na pewno chcesz kontynuować łączenie (tak / nie)?

Wpisałem „tak” i w końcu zadziałało, zazwyczaj powinieneś otrzymać komunikat podobny do tego:

Ostrzeżenie: na stałe dodano „[link do repozytorium]” (ECDSA) do listy znanych hostów.

Uwaga : jeśli korzystasz z systemu Windows, upewnij się, że używasz Git Bash do wszystkich poleceń, to nie działało w zwykłej powłoce cmd lub PowerShell, naprawdę musiałem to zrobić w Git Bash.

Na koniec usunąłem repozytorium drugiego klonu ( myRepo2w tym przykładzie) i wróciłem do mojego pierwszego repo i mogłem w końcu zrobić wszystkie rzeczy Git jak zwykle w moim ulubionym edytorze VSCode.


Rzeczywiście, mój monit Cygwin wygląda prawie dokładnie tak, jak mój monit git bash, ale działa tylko w wierszu polecenia git bash!
Josiah Yoder,

3

Jeśli używasz git dla Windows.

  • Otwórz git GUI.
  • Otwórz lokalne repozytorium git w git GUI.
  • Dodaj pilota lub naciśnij, jeśli pilot już istnieje.
  • Odpowiedz „tak” na pytanie, czy chcesz kontynuować.

Klient GUI dodaje klucz do ciebie ~/.ssh/known_hosts. Łatwiej jest to zapamiętać, jeśli nie robisz tego często, a także unikasz konieczności używania wiersza poleceń git (standardowe wiersze poleceń systemu Windows nie mają ssh-keyscanpliku wykonywalnego.


2

Gdy serwer zdalny chce połączyć się z prywatnym repozytorium, uwierzytelnia się za pośrednictwem ssh. Utwórz parę klucz prywatny-publiczny za pomocą ssh-keygen lub jeśli masz już klucz publiczny-prywatny. skopiuj i wklej klucz publiczny w Ustawieniach prywatnego repozytorium.

YourPrivateRepo -> Ustawienia -> Wdróż klucze -> Dodaj klucz wdrażania -> Wklej klucz publiczny.

Teraz zdalny serwer będzie mógł połączyć się z prywatnym repozytorium.

UWAGA: Klucze wdrażania mają dostęp tylko do odczytu repozytorium. Musisz wyraźnie zezwolić na dostęp do zapisu.


1

Oznacza to, że klucz zdalnego hosta został zmieniony (może to być zmiana hasła hosta),

Twój terminal zaproponował wykonanie tego polecenia jako użytkownik root

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

Musisz usunąć tę nazwę hosta z listy hostów na komputerze / serwerze. Skopiuj sugerowane polecenie i wykonaj jako użytkownik root.

$ 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

Spróbuj ponownie, mam nadzieję, że to zadziała.


Uwaga: w zależności od powłoki może być konieczne wyjście z nawiasów kwadratowych \ [i \] lub użycie cudzysłowów.
Phlarx

1

Na pytanie:

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

Rodzaj tak jak odpowiedź

W ten sposób rozwiązałem mój problem. Ale jeśli spróbujesz po prostu nacisnąć przycisk Enter, to nie zadziała!


0

Możesz użyć swojego „git url” w formacie URL „https” w pliku Jenkinsfile lub gdziekolwiek chcesz.

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


0

Napotkałem ten sam błąd w DockerFile podczas kompilacji, gdy obraz był publiczny. Niewiele zmodyfikowałem w Dockerfile.

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

Wynika to z tego, że przy użyciu git@github.com: ... kończy się> użycie SSH do klonowania, a wewnątrz kontenera twój klucz prywatny jest niedostępny. Zamiast tego będziesz chciał użyć RUN klon git> https://github.com/edenhill/librdkafka.git .


-1

Miałem podobny problem, niestety użyłem interfejsu GitExtensions i zapomniałem, że napisałem hasło. Z HMI .... zapomnij! Nie wpisuj hasła podczas generowania klucza!


-4

Dostałem tę wiadomość, gdy próbowałem git clonerepozytorium, które nie było moje. Rozwiązaniem było rozwidlenie, a następnie sklonowanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.