Mensagem de erro
Host key verification failed.
Também aparece como
- No ED25519 host key is known for 127.0.0.1 and you have requested strict checking.
- fatal: Could not read from remote repository.
O Git imprime a mensagem seguida de “fatal: Could not read from remote repository.”. O tipo de chave na linha anterior (`ED25519`, `ECDSA`, `RSA`) é o tipo que o servidor ofereceu.
O que significa
O ssh não conseguiu confirmar que o servidor é quem diz ser e, por isso, abortou antes da autenticação. Ou o host não está no `known_hosts` e o ssh não pôde perguntar a você (modo batch, CI, um comando Git sem terminal), ou ele está listado com outra chave. A linha anterior diz qual é o caso: “No … host key is known for …” para um host desconhecido, um grande aviso “REMOTE HOST IDENTIFICATION HAS CHANGED” para uma chave que mudou.
Por que acontece
Primeira conexão sem terminal
comumRunners de CI, tarefas do cron, builds do Docker e o `git` dentro de scripts começam com um `known_hosts` vazio. Com `BatchMode yes` ou sem TTY, o ssh não consegue mostrar a pergunta de confirmação e falha.
A chave do host é diferente da registrada
comumServidor reinstalado, endereço IP reaproveitado por outra máquina, balanceador de carga na frente de hosts com chaves diferentes — ou uma interceptação. Veja a entrada “REMOTE HOST IDENTIFICATION HAS CHANGED”.
O arquivo known_hosts não é o que você imagina
ocasionalUm `HOME` diferente no CI ou no sudo, `UserKnownHostsFile` apontando para outro lugar ou um arquivo de outro usuário que o ssh não consegue ler nem gravar.
Como corrigir
- 1.
Registrar a chave do host depois de verificá-la
O `ssh-keyscan` mostra o que a rede entrega; compare a impressão digital obtida com a de uma fonte confiável antes de confiar na chave.
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.
Fornecer ao CI um known_hosts verificado
Guarde a linha verificada como segredo ou no repositório. Com `StrictHostKeyChecking no` ou com `ssh-keyscan` em tempo de execução, o job aceita qualquer servidor que responder.
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.
Usar as chaves publicadas pelos serviços de hospedagem Git
O GitHub, o GitLab e o Bitbucket publicam as impressões digitais das chaves de host deles; o GitHub também as disponibiliza pela API meta.
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