Сообщение об ошибке
Host key verification failed.
Также выводится как
- No ED25519 host key is known for 127.0.0.1 and you have requested strict checking.
- fatal: Could not read from remote repository.
После этого сообщения Git выводит «fatal: Could not read from remote repository.». Тип ключа в предыдущей строке (`ED25519`, `ECDSA`, `RSA`) — это тип, который предложил сервер.
Что это означает
ssh не смог убедиться, что сервер — тот, за кого себя выдаёт, поэтому прервал работу до аутентификации. Либо хоста нет в `known_hosts`, а спросить вас ssh не мог (пакетный режим, CI, команда Git без терминала), либо хост записан там с другим ключом. Какой из случаев, показывает предыдущая строка: «No … host key is known for …» для неизвестного хоста и крупное предупреждение «REMOTE HOST IDENTIFICATION HAS CHANGED» для изменившегося.
Почему это происходит
Первое подключение без терминала
частоCI-раннеры, задания cron, сборки Docker и `git` внутри скриптов начинают с пустым `known_hosts`. При `BatchMode yes` или без TTY ssh не может показать запрос подтверждения и завершается ошибкой.
Ключ хоста отличается от записанного
частоСервер переустановили, IP-адрес достался другой машине, перед хостами с разными ключами стоит балансировщик нагрузки — или соединение перехвачено. См. страницу об ошибке «REMOTE HOST IDENTIFICATION HAS CHANGED».
Файл known_hosts не тот, о котором вы думаете
иногдаДругой `HOME` в CI или при sudo, `UserKnownHostsFile`, указывающий в другое место, или файл другого пользователя, который ssh не может прочитать или записать.
Как исправить
- 1.
Запишите ключ хоста, предварительно проверив его
`ssh-keyscan` показывает то, что отдаёт сеть; прежде чем доверять ключу, сравните его отпечаток с отпечатком из доверенного источника.
bash # Store the server's host key once, after checking its fingerprint out of band. ssh-keyscan -t ed25519 server.example.com > /tmp/hostkey ssh-keygen -lf /tmp/hostkey # compare with the fingerprint from your provider/console cat /tmp/hostkey >> ~/.ssh/known_hosts - 2.
Передавайте в CI проверенный known_hosts
Храните проверенную строку в секретах CI или в репозитории. С `StrictHostKeyChecking no` или с `ssh-keyscan` во время выполнения задание примет любой ответивший хост.
yaml # GitHub Actions: put the verified known_hosts line into a secret, not ssh-keyscan at run time - name: Configure SSH run: | install -d -m 700 ~/.ssh echo "${{ secrets.DEPLOY_KNOWN_HOSTS }}" > ~/.ssh/known_hosts chmod 600 ~/.ssh/known_hosts - 3.
Используйте опубликованные ключи Git-хостингов
GitHub, GitLab и Bitbucket публикуют отпечатки своих ключей хостов; GitHub — ещё и через свой meta API.
bash # GitHub publishes its SSH host keys (also at https://api.github.com/meta, "ssh_keys") curl -s https://api.github.com/meta | jq -r '.ssh_keys[] | "github.com " + .' >> ~/.ssh/known_hosts