Ошибка Git: «Ошибка проверки ключа хоста» при подключении к удаленному репозиторию


224

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

Я использую следующий формат для моей команды:

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

Это хорошо сработало для большинства членов моей команды. Обычно после выполнения этой команды Git запрашивает пароль пользователя, а затем запускает клонирование. Однако при работе на одном из моих компьютеров я получаю следующую ошибку:

Проверка ключа хоста не удалась.

Неустранимый: Не удалось прочитать из удаленного хранилища.

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


2
Вы которые с помощью SSH для подключения к этому репозиторию, обратите внимание , как ваш URL начинается сssh://
Brandon

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

Ответы:


166

Вы подключаетесь по протоколу 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.
Вы уверены, что хотите продолжить подключение (да / нет)?

Причиной этого запроса является то, что domain.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и создать копию , доступную только для root . ( -rw------- root root) Вы можете легко chownвернуться к соответствующему пользователю, но вы также можете потратить время на отладку, почему git не работает. : D
Эндрю Рюкерт

1
Are you sure you want to continue connecting (yes/no)?, Не делай ту же ошибку, что и я. Вам нужно ввести yes. Простое нажатие Enter не выбирает да по умолчанию
JolonB

307

Как я уже говорил ранее, в Cloning git repo возникает ошибка - проверка ключа хоста не удалась. Неустранимый: удаленный конец неожиданно завис , добавьте GitHub в список авторизованных хостов:

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


3
Это самый безопасный способ, если не считать наличия ключа. Это предполагает, что вы запускаете его только один раз, а не каждый раз, когда вы подключаетесь к серверу.
Zenexer

Закрытое хранилище моей компании использует ecdsa в качестве ключа, поэтому, если решение не работает, возможно, это из-за неправильного алгоритма
Fendy

8
Это должен быть принятый ответ. Спасибо за спасение моего дня.
Кейур

у меня тоже
получалось

Кто-то пометил этот пост (неправильно). Из обзора .
Вай Ха Ли

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.


Этот ответ привел меня к осознанию того, что мне пришлось вручную клонировать репо на своем сервере сборки, чтобы набрать «да», и добавить свой битовый сервер для добавления в мои известные_хосты
Саша

1
@Sashah Если вам нужен только сервер bitbucket в known_hosts, вы можете отредактировать файл вручную. Нет необходимости клонировать репо, если это единственная причина для этого.
Код-ученик

7

У меня возникла та же проблема на недавно установленной системе, но это была проблема udev. Там не было /dev/ttyузла, поэтому мне пришлось сделать:

mknod -m 666 /dev/tty c 5 0

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

@ Geoffroy, я удалил / dev / tty и теперь, когда делаю sudo, я сталкиваюсь с этой ошибкой: sudo: извините, у вас должен быть tty для запуска sudo
Milad

@ xe4me Я никогда не говорил, что вы должны удалить его, в зависимости от системы, которая на самом деле требуется. Перезагрузка должна исправить это.
Geoffroy

@Geoffroy, фактически первый комментатор, сказал, что я должен удалить и воссоздать: d Нет, перезагрузка не сработала, я должен был сказать руту, он исправил это: d
Milad

6

Если вы находитесь в офисной интрасети (в противном случае опасной), которая всегда защищена брандмауэрами, просто добавьте следующие строки в ~ / .ssh / config

Host *
StrictHostKeyChecking no
UserKnownHostsFile = / dev / null


2
Это все еще опасно, с нашими без корпоративных брандмауэров. Откуда вы знаете, что разговариваете с настоящим github без проверки ключа сервера?
Mnebuerquo

1
В корпоративных средах чаще всего используются локальные git-репозитории, а не с открытым исходным кодом. В худшем случае. Конфигурация .ssh в верхней части файла может иметь строки конфигурации, связанные с хостом 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 или powershell, мне действительно пришлось сделать это в Git Bash.

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


Действительно, мое приглашение Cygwin выглядит почти так же, как мое приглашение git bash, но оно работает только в приглашении git bash!
Джозия Йодер

3

Если вы используете git для Windows.

  • Откройте git GUI.
  • Откройте локальный репозиторий git в git GUI.
  • Добавьте пульт или нажмите, если пульт уже существует.
  • Ответьте «да» на вопрос о том, хотите ли вы продолжить.

Клиент 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

Попробуйте еще раз, надеюсь, это работает.


Примечание: в зависимости от вашей оболочки, вам может потребоваться экранировать квадратные скобки \ [и \] или использовать кавычки.
Phlarx

1

Когда спросили:

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

Введите yes в качестве ответа

Так я решил свою проблему. Но если вы попытаетесь просто нажать кнопку ввода, это не сработает!


0

Вы можете использовать свой «git url» в формате 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

У меня была похожая проблема, к сожалению, я использовал HMI GitExtensions и забыл, что написал фразу-пароль. С HMI .... забудь об этом! Не вводите фразу-пароль при генерации ключа!


-4

Я получил это сообщение, когда попытался сделать git cloneрепо, которое не было моим. Исправление было в том, чтобы раскошелиться, а затем клонировать

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.