Corrigindo "Host key verification failed"
O Que Significa "Host key verification failed"?
Conclusão: A chave do host apresentada pelo servidor não corresponde à que seu cliente lembra, então a conexão foi abortada. Não é um problema de chave ou senha — a verificação para na identidade do servidor.
Antes de o SSH autenticar você (por senha ou chave pública), ele primeiro verifica se o servidor que você alcançou é genuíno. Ele faz isso com a "chave do host" do servidor, que é registrada em ~/.ssh/known_hosts na primeira conexão. Em cada conexão posterior, se a chave apresentada não corresponder ao registro, o SSH aborta. Isso é Host key verification failed.
Host key verification failed.
O ponto importante: este erro tem duas causas distintas.
- Uma chave diferente foi apresentada do que a registrada (reconstrução de servidor, IP reutilizado, raramente um ataque man-in-the-middle)
- Um host de primeira vez foi rejeitado pela verificação estrita (
StrictHostKeyChecking yesetc.)
As correções são completamente diferentes, então identifique qual caso você tem primeiro.
Pré-requisitos
- Cliente: Ubuntu / macOS (os conceitos são os mesmos)
- Servidor: servidor OpenSSH
- O que você inspeciona é principalmente o
~/.ssh/known_hostsdo lado do cliente
Como Fazer a Triagem da Causa?
Conclusão: Leia a linha logo acima do erro.
REMOTE HOST IDENTIFICATION HAS CHANGEDsignifica divergência de chave;No ... host key is knownsignifica que um host de primeira vez foi rejeitado.
A causa está impressa na linha logo antes de Host key verification failed.. Role para cima e leia.
Padrão A: a chave mudou (divergência com o registro)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! ... Offending ECDSA key in /home/user/.ssh/known_hosts:12 ... Host key verification failed.
Padrão B: um host de primeira vez foi rejeitado
No ED25519 host key is known for server.example.com and you have requested strict checking. Host key verification failed.
Para o Padrão A vá para Corrigindo uma chave alterada; para o Padrão B vá para Conexões de primeira vez.
Por Que a Chave Muda? Visão Geral
Conclusão: A maioria das mudanças são eventos legítimos do lado do servidor (reconstrução, IP reutilizado). Uma pequena fração são man-in-the-middle, então sempre confirme que a mudança é legítima antes de excluir.
| Causa | Quando acontece | Risco |
|---|---|---|
| Reconstrução / reinstalação do SO | Chaves do host foram regeneradas | Baixo |
| Reatribuição de IP / hostname | Cloud ou DHCP aponta o nome para um novo servidor | Baixo |
| Rotação de chave do host | Chaves atualizadas por política operacional | Baixo |
| Alvo errado | Um bastion ou port forward levou a um host diferente | Médio |
| Man-in-the-middle (MITM) | Um atacante no caminho está se passando pelo servidor | Alto |
A maioria dos casos é de baixo risco, mas quando a chave muda sem explicação, não pule a verificação antes de excluir.
Onde Fica o known_hosts e o Que Ele Registra?
Conclusão: Registros por usuário ficam em
~/.ssh/known_hosts, os do sistema em/etc/ssh/ssh_known_hosts. Cada linha é "host/IP + tipo de chave + chave pública", e a divergência com ele dispara este erro.
$ cat ~/.ssh/known_hosts
Uma linha mapeia para uma chave de um host.
server.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... [server.example.com]:2222 ecdsa-sha2-nistp256 AAAAE2VjZHNh...
Note que portas não padrão são registradas como [hostname]:port. Para encontrar a entrada correspondente, use ssh-keygen -F.
$ ssh-keygen -F server.example.com
Com HashKnownHosts yes (padrão do Ubuntu), os hostnames são hasheados, então você não consegue identificar a linha visualmente com cat. Mas ssh-keygen -R / -F abaixo lidam com entradas hasheadas corretamente, então não há necessidade de editar o arquivo manualmente.
Corrigindo uma Chave Alterada (ssh-keygen -R)
Conclusão: Remova a entrada com
ssh-keygen -R hostname, depois reconecte e registre a nova chave. Você não precisa abrirknown_hostse excluir a linha manualmente.
O erro imprime o arquivo e número da linha: Offending ... key in /home/user/.ssh/known_hosts:12. Remover isso é a correção, mas ssh-keygen -R é mais seguro do que editar manualmente pelo número da linha.
$ ssh-keygen -R server.example.com
# Host server.example.com found: line 12 /home/user/.ssh/known_hosts updated. Original contents retained as /home/user/.ssh/known_hosts.old
Se você usa uma porta não padrão, use o formato registrado.
$ ssh-keygen -R '[server.example.com]:2222'
Se você também conecta por IP, deve remover tanto a entrada do hostname quanto a do IP.
$ ssh-keygen -R 192.0.2.10
Após excluir, reconectar solicita sobre a nova chave. Verifique a fingerprint e confirme com yes.
$ ssh user@server.example.com
The authenticity of host 'server.example.com (192.0.2.10)' can't be established. ED25519 key fingerprint is SHA256:abcd1234... Are you sure you want to continue connecting (yes/no/[fingerprint])?
Guias antigos frequentemente editam manualmente pelo número da linha, mas isso é propenso a erros com HashKnownHosts ou múltiplas entradas. Prefira ssh-keygen -R.
Antes de Excluir: Confirme Que a Mudança é Legítima
Conclusão: Se a mudança é inesperada, compare com a fingerprint real do servidor antes de excluir. Se diferirem, suspeite de man-in-the-middle e não conecte por esse caminho.
O propósito inteiro de Host key verification failed é detectar personificação. O hábito de limpar o aviso mecanicamente desativa essa proteção você mesmo.
Se você consegue acessar o servidor por outro caminho (console, etc.), exiba a fingerprint da própria chave do host do servidor.
$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:abcd1234... root@server (ED25519)
Se este SHA256:... corresponder à fingerprint que o SSH mostra ao reconectar, a mudança é legítima e você pode registrá-la com segurança. Se diferir, desconfie desse caminho de conexão.
"Apenas exclua e reconecte" para uma mudança de chave inesperada é perigoso — permite que escuta ou adulteração no caminho passe despercebida. Pule a verificação apenas quando você mesmo sabe sobre o evento de mudança (reconstrução, migração, etc.).
Conexões de Primeira Vez (StrictHostKeyChecking)
Conclusão:
No ... host key is known ... strict checkingsignifica queStrictHostKeyChecking yesrejeitou um host desconhecido. Registre a chave correta com segurança; não afrouxe parano.
Para um servidor de primeira vez com verificação estrita habilitada, o SSH recusa imediatamente sem prompt interativo.
No ED25519 host key is known for server.example.com and you have requested strict checking. Host key verification failed.
A correção é registrar a chave correta em known_hosts. A forma mais segura é registrá-la após verificar a fingerprint real do servidor. Para permitir apenas desta vez, use accept-new.
$ ssh -o StrictHostKeyChecking=accept-new user@server.example.com
accept-new (OpenSSH 7.6+) registra automaticamente hosts desconhecidos mas ainda rejeita uma chave alterada para um host conhecido, diferente de no. Ele automatiza apenas o registro de primeira vez enquanto mantém a detecção de personificação.
StrictHostKeyChecking no ignora até uma chave alterada, então não use em produção. Quando automação precisa tolerar hosts desconhecidos, escolha accept-new.
Pré-Registrando known_hosts (ssh-keyscan)
Conclusão: Para automação ou implantações em frota,
ssh-keyscanpode buscar chaves e adicioná-las aoknown_hosts— mas apenas quando você confia no próprio caminho de busca.
Para CI / Ansible onde nenhum prompt interativo é possível, registre chaves antes de conectar.
$ ssh-keyscan -t ed25519 server.example.com >> ~/.ssh/known_hosts
Você também pode buscar vários hosts de uma vez.
$ ssh-keyscan server1 server2 server3 >> ~/.ssh/known_hosts
ssh-keyscan ingere "qualquer chave que esteja visível na rede neste momento". Se o caminho estiver comprometido no momento da busca, você registra uma chave forjada. Quando possível, compare a fingerprint obtida com o valor conhecido como correto.
Checklist Quando Ainda Falha
Conclusão: Diferencie A de B pela linha acima do erro — corrija A com
ssh-keygen -R, corrija B com registro seguro. Sempre verifique antes de excluir e evite afrouxar as configurações demais.
- [ ] Você leu a linha logo acima de
Host key verification failed.(A: mudança / B: primeira vez)? - [ ] Para o Padrão A, você verificou o arquivo e linha em
Offending ... known_hosts:NN? - [ ] A mudança de chave é esperada? (Se não, compare fingerprints.)
- [ ] Você removeu com
ssh-keygen -R hostname(incluindo formato de porta e IP)? - [ ] A fingerprint ao reconectar correspondeu ao valor conhecido como correto?
- [ ] Para o Padrão B, você evitou configurar descuidadamente
StrictHostKeyChecking no? (Considereaccept-new.) - [ ] Há entradas obsoletas no
/etc/ssh/ssh_known_hostsdo sistema?