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 są 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.