Mensagem de erro
ssh: handshake failed: knownhosts: key is unknown
Também aparece como
- ssh: handshake failed: knownhosts: key mismatch
- ssh: must specify HostKeyCallback
O `*knownhosts.KeyError` tem um campo `Want`: vazio em “key is unknown” e preenchido em “key mismatch”. “ssh: must specify HostKeyCallback” significa que o `ClientConfig` não tem nenhuma verificação de chave de host.
golang.org/x/crypto/ssh/knownhosts (Go) — *knownhosts.KeyError from the HostKeyCallback
O que significa
O callback `knownhosts` não encontrou nenhuma entrada para este host (e porta) no seu arquivo known_hosts, então se recusou a confiar na chave que o servidor apresentou. É a autenticação do host funcionando: sem uma chave conhecida, o cliente não consegue distinguir o servidor real de um impostor. “key mismatch” é o caso irmão mais grave — o host está listado, mas com outra chave.
Por que acontece
O host nunca foi adicionado
comumO OpenSSH interativo pergunta “Are you sure you want to continue connecting?” e grava a chave. Programas em Go não perguntam nada, então um host que nunca foi adicionado — ou um contêiner novo com o known_hosts vazio — falha aqui.
Formato errado do nome do host ou da porta
comumPara portas diferentes da 22, as entradas são escritas como `[host]:port`. Uma entrada só com `host` não corresponde a uma conexão na porta 2222, e um endereço IP não corresponde a uma entrada gravada com o nome DNS.
A chave do servidor mudou (key mismatch)
ocasionalServidores reinstalados, IPs de nuvem reaproveitados e balanceadores de carga na frente de vários hosts apresentam chaves novas. Uma divergência também pode indicar interceptação, por isso ela deve ser resolvida conferindo a nova impressão digital, e não removendo a verificação.
Como corrigir
- 1.
Adicionar a chave do host depois de verificá-la
O `ssh-keyscan` só obtém o que a rede entrega. Compare a impressão digital com uma fonte confiável antes de adicioná-la; incorpore as entradas verificadas às imagens ou ao provisionamento.
bash # Fetch the host key, then compare its fingerprint with one obtained out of band # (cloud console, provisioning output, the server's /etc/ssh/*.pub). ssh-keyscan -t ed25519 -p 22 server.example.com > /tmp/hostkey ssh-keygen -lf /tmp/hostkey cat /tmp/hostkey >> ~/.ssh/known_hosts # only after the fingerprints match - 2.
Usar a forma entre colchetes para portas personalizadas
O knownhosts compara o host e a porta exatamente como o OpenSSH faz. `knownhosts.Normalize` e `knownhosts.Line` geram, a partir do Go, entradas no formato correto.
text # known_hosts entry for a non-default port: brackets and the port are part of the name [server.example.com]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...