Помилка Git: "Підтвердження ключа хоста не вдалося" під час підключення до віддаленого сховища


222

Я намагаюся підключитися до віддаленого сховища Git, яке знаходиться на моєму веб-сервері, і клоную його до моєї машини.

Я використовую такий формат для своєї команди:

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

Це спрацювало чудово для більшості членів моєї команди. Зазвичай після запуску цієї команди Git запропонує ввести пароль користувача, а потім запустить клонування. Однак під час роботи на одній із моїх машин я отримую таку помилку:

Помилка перевірки ключа хоста.

fatal: Не вдалося прочитати з віддаленого сховища.

Ми не використовуємо SSH ключі для підключення до цього сховища, тому я не впевнений, чому Git перевіряє його на цій конкретній машині.


1
Ви які з допомогою SSH для підключення до цього сховища, зверніть увагу , як ваш URL починається зssh://
Brandon

У мене схожа проблема . Хто-небудь може мені допомогти, будь ласка? Я застряг :(
SepSol

Відповіді:


164

Ви підключаєтесь через протокол SSH, як зазначено в ssh://префіксі вашої URL-адреси клонування. Використовуючи SSH, кожен хост має ключ. Клієнти пам’ятають ключ хоста, пов’язаний з певною адресою, і відмовляються підключитися, якщо здається, що ключ хоста змінюється. Це запобігає людині в середині нападів.

Ключ хоста для domain.com змінено. Якщо це не здається вам корисним , видаліть старий ключ з локального кешу, відредагувавши, ${HOME}/.ssh/known_hostsщоб видалити рядок для domain.com або дозволити службі SSH зробити це для вас

ssh-keygen -R domain.com

Звідси запишіть оновлений ключ, зробивши його самостійно

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

або, що те ж саме, нехай sshзробить це за вас в наступний раз , коли ви з'єднатися з git fetch, git pullабо git push(або навіть простий ПР » ssh domain.com), відповідаючи так , коли буде запропоновано

Автентичність хоста "domain.com (abcd)" неможливо встановити.
Відбиток ключа RSA - XX: XX: ...: XX.
Ви впевнені, що хочете продовжувати з'єднання (так / ні)?

Причиною цього підказок є те, що домен.com вже не known_hostsвидаляється після видалення, і, мабуть, не в системі /etc/ssh/ssh_known_hosts, тому sshне має можливості дізнатися, чи справді хост на іншому кінці з'єднання - це справді domain.com. (Якщо /etcвводиться неправильний ключ , особі з адміністративними привілеями доведеться оновити файл у всій системі.)

Я настійно рекомендую вам також розглянути можливість користування автентифікацією ключів. Таким чином, ви ssh-agentможете зберігати ключові матеріали для зручності (а не всі, хто повинен вводити її пароль для кожного з'єднання з сервером), а паролі не переходять через мережу.


3
Цікаво, що запуск sudo ssh-keygen -R domain.comможе перейменувати існуючий known_hostsфайл, який буде known_hosts.old, і створити копію, що читається лише коренем . ( -rw------- root root) Ви можете легко chownповернутись до відповідного користувача, але ви також можете витратити післяобідню налагодження, чому git порушено. : D
Ендрю Рюкерт

1
Are you sure you want to continue connecting (yes/no)?. Не робіть тієї самої помилки, як я. Вам потрібно набрати yes. Якщо просто натиснути
клавішу

306

Як я вже відповів раніше у Cloning git repo викликає помилку - не вдалося перевірити ключ хоста. фатально: віддалений кінець несподівано завис , додайте GitHub до списку авторизованих хостів:

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


3
Це найбезпечніший спосіб, окрім того, щоб вже мати ключ. Це припускає, що ви запускаєте його лише один раз, а не кожен раз, коли ви підключаєтесь до сервера.
Zenexer

Моє приватне сховане сховище компанії використовує ecdsa як ключ, тому якщо рішення не працює, можливо, це тому, що алгоритм невірний
Fendy

8
Це має бути прийнятою відповіддю. Дякуємо, що врятували мені день.
Кейур

працював і на мене, мені було цікаво, чому я не можу клонувати власне репо
StackAttack

Хтось позначив цю публікацію (неправильно). З огляду .
Вай Ха Лі

55

У мене була аналогічна проблема, але, використовуючи SSH-ключі. З відповіді Тупі вище я з’ясував, що проблема полягає у відсутності відомого файлу known_hosts або github.com у списку відомих хостів. Ось такі кроки, які я дотримувався, щоб вирішити це питання -

  1. mkdir -p ~/.ssh
  2. ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  3. ssh-keygen -t rsa -C "user.email"
  4. відкрийте відкритий ключ за допомогою цієї команди $ cat ~/.ssh/id_rsa.pubта скопіюйте її.
  5. Додайте ключ id_rsa.pub до списку ключів SSH у своєму профілі GitHub.

1
@OJFord FYI: Я відредагував оригінальну відповідь таким чином, що робить ваш коментар застарілим. TBH, і при всій повазі, це було не зовсім коректно. touchКоманда зазнає невдачі в разі , якщо ~/.sshкаталог не існує, так що крок 1 по - , як і раніше потрібно. Також вам не потрібно до touchфайлу, перш ніж використовувати >>переадресацію. Він буде створений при необхідності (але потрібен лише файл, а не весь шлях, тому все mkdir -pще потрібен). -pВаріант зробити його роботу в разі , якщо каталог вже існує.
Тад Ліспі

1
Це # 2, ssh-keyscanякого не вистачає в документах Github щодо додавання нового ключа ssh.
Філ Ендрюс

1
У мене виникли проблеми з тим, що я Dockerfileмав відсутність дозволу. Додавши сюди другий крок, вирішено цю проблему! Дякую за чудову роботу
Спенсер Поллок

37

Це відбувається тому, що github наразі немає у ваших відомих господарів.

Вам буде запропоновано додати github до відомих вами хостів. Якщо цього не сталося, ви можете запустити, ssh -T git@github.comщоб отримати відповідне повідомлення ще раз.


2
Це правильна відповідь, якщо ви ніколи не підкажете.
Маттіас Хагеман

15

Для мене я просто повинен був набрати "так" у запиті, який запитує "Ви впевнені, що хочете продовжувати з'єднання (так / ні)?" а не просто натискання клавіші Enter.


Ця відповідь дозволила мені зрозуміти, що мені довелося вручну клонувати репо на моєму сервері збирання, щоб набрати "так" і додати мій сервер bitbucket до моїх
відомих_хостів

1
@Sashah Якщо все, що вам потрібно, це сервер bitbucket у відомих_хостях, ви можете редагувати файл вручну. Не потрібно клонувати репо, якщо це є єдиною причиною для цього.
Код-учень

7

Я отримав таку ж проблему в нещодавно встановленій системі, але це була проблема удеву. Вузла не було /dev/tty, тому мені довелося зробити:

mknod -m 666 /dev/tty c 5 0

1
Це працювало для мене, тому що / dev / tty створено як файл, дуже дивно! (тож вам доведеться видалити його, а потім відтворити його за допомогою mknod)
Doomsday

@Geoffroy, я видалив / dev / tty, і тепер, коли робити sudo, я зіткнувся з цією помилкою: sudo: вибачте, ти повинен мати тти для запуску судо
Мілад

@ xe4me Я ніколи не говорив, що ви повинні його видаляти, залежно від системи, яка насправді потрібна. Перезавантаження має це виправити.
Джеффрой

@Geoffroy, власне перший коментатор, сказав, що я маю видалити і відтворити: d Ні, перезавантаження не спрацювало, я повинен був сказати корінь, він це виправив: d
Мілад

6

Якщо ви перебуваєте в інтранетній мережі офісу (інакше небезпечно), яка завжди захищена брандмауерами, просто у наступному рядку у вашому ~ / .ssh / config

Хост *
StrictHostKeyChecking немає
UserKknownHostsFile = / dev / null


2
Це все ще небезпечно, без наших корпоративних брандмауерів. Звідки ти знаєш, що ти розмовляєш із справжнім github без підтвердження ключа сервера?
Mnebuerquo

1
У корпоративному середовищі в основному використовуються локальні git repos, ніколи не відкриваються. Найгірший випадок .ssh config у верхній частині файлу може мати чіткі лінії конфігурації, пов'язані з github, для ssh для вибору більш конкретних відповідностей.
суніль

5

Що для мене спрацювало - спершу додати свій SSH ключ нового комп'ютера, я дотримувався цих інструкцій від GitLab - додав ключ SSH . Зауважте, що, оскільки я перебуваю на Win10, мені довелося виконувати всі ці команди в Git Bash для Windows (він не працював у звичайній оболонці DOS cmd).

Потім знову в Git Bash мені довелося зробити git cloneрепо, з якими у мене виникли проблеми, і в моєму випадку мені довелося клонувати його до іншого імені, оскільки я вже мав його локально і не хотів втрачати свої зобов'язання. Наприклад

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

Тоді я отримав підказку додати його до списку відомих хостів, питання може бути таким:

Ви впевнені, що хочете продовжувати з'єднання (так / ні)?

Я набрав "так", і воно, нарешті, спрацювало, ти зазвичай отримуєш повідомлення, подібне до цього:

Попередження: Постійно додано "[ваш репосилання]" (ECDSA) до списку відомих хостів.

Примітка : якщо ви перебуваєте в Windows, переконайтеся, що ви використовуєте Git Bash для всіх команд, це не працювало в звичайній оболонці cmd або powerhell, мені справді довелося це робити в Git Bash.

Нарешті, я видалив другий репо-клон ( myRepo2у прикладі) і повернувся до свого першого репо, і нарешті я міг зробити всі речі Git як звичайні в моєму улюбленому редакторі VSCode.


Дійсно, мій підказка Cygwin виглядає майже точно так само, як мій підказник щодо git bash, але він працює лише у підказці git bash!
Йосія Йодер

3

Якщо ви використовуєте git для Windows.

  • Відкрийте графічний інтерфейс git.
  • Відкрийте локальний сховище git у графічному інтерфейсі git.
  • Додайте пульт або натисніть, якщо віддалений вже існує.
  • Дайте відповідь "так" на питання про те, чи хочете ви продовжувати.

Клієнт GUI додає вам ключ ~/.ssh/known_hosts. Це легше запам’ятати, якщо ви не робите це часто, а також уникнете необхідності використання командного рядка git (у стандартних командних рядках Windows немає ssh-keyscanвиконуваного файлу.


2

Коли віддалений сервер хоче підключитися до приватного репо, він підтверджує автентифікацію через ssh. Створіть пара приватно-відкритих ключів за допомогою ssh-keygen або якщо у вас вже є відкрито-приватний ключ. скопіюйте та вставте відкритий ключ у Налаштування приватного репо.

YourPrivateRepo -> Налаштування -> Клавіші розгортання -> Додати ключ розгортання -> Вставити відкритий ключ.

Тепер віддалений сервер зможе підключитися до приватного репо.

ПРИМІТКА. Клавіші розгортання мають доступ лише для читання репо. Потрібно чітко дозволити доступ до запису.


1

Це означає, що ваш ключ віддаленого хоста змінено (може бути змінено пароль хоста),

Ваш термінал запропонував виконати цю команду як користувач root

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

Ви повинні видалити це ім'я хоста зі списку хостів на своєму ПК / сервері. Скопіюйте запропоновану команду та виконайте як користувач 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

Спробуйте ще раз, Сподіваюся, це працює.


Примітка: залежно від оболонки, можливо, вам доведеться уникати квадратних дужок \ [і \] або використовувати лапки.
Фларкс

1

На запитання:

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

Введіть так як відповідь

Саме тому я вирішив своє питання. Але якщо спробувати просто натиснути кнопку введення, це не вийде!


0

Ви можете використовувати свій "git url" у форматі "https" у форматі Jenkinsfile або де завгодно.

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


0

Я зіткнувся з тією ж помилкою всередині DockerFile під час збирання, коли зображення було загальнодоступним. Я мало змінив Dockerfile.

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

Це пов’язано з тим, що при використанні git@github.com: ... синтаксис закінчується> використовуючи SSH для клонування, а всередині контейнера Ваш приватний ключ недоступний. Ви хочете замість цього використовувати RUN git clone> https://github.com/edenhill/librdkafka.git .


-1

У мене був аналогічний випуск, на жаль, я використовував HITExtensions HMI і забув, що я написав пароль. З HMI .... забудь! Не вводьте парольну фразу під час генерації ключа!


-4

Це повідомлення я отримав, коли спробував виконати git cloneрепо, яке не було моїм. Виправлення було розщедрити, а потім клонувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.