2012-05-05 19:05:56 +0000 2012-05-05 19:05:56 +0000
315
315

Como corrigir o aviso sobre a chave de anfitrião ECDSA

Estou a tentar configurar um SSH sem palavra-passe num servidor Ubuntu com ssh-copy-id myuser@myserver, mas estou a receber o erro:

Aviso: a chave de anfitrião ECDSA para ‘myserver’ difere da chave para o endereço IP ‘192.168.1.123’

O que está a causar isto, e como corrigi-lo? Tentei apagar o directório .ssh na máquina remota, e executar o ssh-keygen -R "myserver" localmente, mas isto não resolve o erro.

Respostas (13)

459
459
459
2012-05-05 20:20:21 +0000

Retirar a chave em cache para 192.168.1.123 na máquina local:

ssh-keygen -R 192.168.1.123
69
69
69
2014-03-11 18:52:18 +0000

No meu caso, a ssh-keygen -R ... não resolveu o aviso. Eu tinha informação extra como esta:

Offending key for IP in /home/myuser/.ssh/known_hosts:8
Matching host key in /home/myuser/.ssh/known_hosts:24

Eu simplesmente editei manualmente ~/.ssh/known_hosts e apaguei a linha 8 (a “chave ofensiva”). Tentei restabelecer a ligação, o anfitrião foi permanentemente adicionado, e tudo ficou bem depois disso!

19
19
19
2014-01-16 08:12:11 +0000

Eu faço muito ssh-ing entre os meus computadores LAN e as minhas duas contas de webhosting, por isso resolvi todo o tipo de probabilidades e acabo com o SSH, incluindo problemas de autenticação usando ssh -v para ver onde e o que correu mal.

Tendo acabado de resolver esta questão e não estando satisfeito com as respostas, eu mesmo queria saber “porquê”…

O gatilho do meu caso é: instalei um novo SO servidor no trabalho e ao instalar o pacote openssh-server, foi gerado um novo conjunto de chaves de anfitrião no servidor do trabalho. Anteriormente, todos os meus SOs de servidor eram Ubuntu e desta vez mudou para Debian (e suspeito que há uma diferença de permissões matizada).

Quando todos os SOs eram Ubuntu e eu reinstalo o SO de um servidor, no primeiro SSH a entrar nele, recebo este tipo de aviso, que prefiro ao aviso silencioso acima!

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
06:ea:f1:f8:db:75:5c:0c:af:15:d7:99:2d:ef:08:2a.
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending key in /home/user/.ssh/known_hosts:4
RSA host key for domain.com has changed and you have requested strict checking.
Host key verification failed.

Depois abro ~/. ssh/known_hosts no computador a iniciar o ssh, apagar essa linha, voltar a ligar e isto acontece:

chris@home ~ $ ssh work
The authenticity of host '[work]:11122 ([99.85.243.208]:11122)' can't be established.
ECDSA key fingerprint is 56:6d:13:be:fe:a0:29:ca:53:da:23:d6:1d:36:dd:c5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[work]:11122 ([99.85.243.208]:11122)' (ECDSA) to the list of known hosts.
Linux rock 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64

Esse bit cerca de :11122 é o número da porta a partir da qual encaminho o SSH na firewall

Verifiquei os backups de um antigo servidor Ubuntu e fiz o diff’d contra a minha nova instalação Debian:

Ubuntu: Debian:
# Package generated configuration file # Package generated configuration file
# See the sshd(8) manpage for details # See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for # What ports, IPs and protocols we listen for
Port 22 Port 22
# Use these options to restrict which interface # Use these options to restrict which interfaces
#ListenAddress :: #ListenAddress ::
#ListenAddress 0.0.0.0 #ListenAddress 0.0.0.0
Protocol 2 Protocol 2
# HostKeys for protocol version 2 # HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_dsa_key
------------------------------------------------ HostKey /etc/ssh/ssh_host_ecdsa_key
#Privilege Separation is turned on for security #Privilege Separation is turned on for security
UsePrivilegeSeparation yes UsePrivilegeSeparation yes

Então sim, provavelmente, o host começou a usar chaves ecdsa recentemente, o que baseado nas mudanças do Ubuntu ultimamente, eu culparia por uma atualização. A mudança do Ubuntu para longe do SO linux sólido e rochoso com que eu contava é a razão pela qual instalei Debian desta vez.

Eu li um security.SE q/a no ecdsa e já removi essa linha do sshd_config meu novo servidor Debian. (e executei o service ssh restart)

7
7
7
2014-01-16 09:06:57 +0000

A rapidez ocorre sempre porque os endereços IP mudam constantemente quando se utiliza o endereçamento dinâmico. Tente usar o IP estático para que só tenha de adicionar a chave uma única vez.

6
6
6
2015-05-14 18:16:42 +0000

ssh-keygen -f “/root/.ssh/known_hosts” -R 192.168.1.123

Isto deverá substituir as chaves existentes em “known_hosts.old” e criar uma nova. Esta solução funcionou para mim no mesmo cenário

4
4
4
2018-03-15 12:23:28 +0000

Adicionei as seguintes linhas ao meu ~/.ssh/config, desactivando assim a verificação rigorosa do host para todos os endereços .locais. (com a atribuição de endereços DHCP, os endereços ip das minhas máquinas locais estão sempre a mudar)

host *.local
    StrictHostKeyChecking no

Ainda assim, o aviso é feito, o que por mim está bem.

2
2
2
2014-10-21 09:17:22 +0000

Está a utilizar o mesmo utilizador para se ligar?

Se estiver ligado a um PC local como utilizador John* e ligado ao servidor B* como utilizador Adolf@B e tudo estiver OK, não significa que tudo esteja OK se estiver ligado a um PC local como utilizador Jane e ligado ao servidor B como utilizador Adolf@B*.

Se quiser entrar no servidor B como utilizador Beda a partir do PC A sem password, experimente este comando, tudo a partir do PC A:

ssh-keygen -t rsa

Este comando gera a chave e guarda a chave no ficheiro. Por favor deixe passphrase vazia.

ssh Beda@B mkdir -p .ssh

Este comando cria o directório, caso ainda não existam. Caso contrário, não imprima uma mensagem de erro.

cd ~/.ssh

Este comando altera o directório para o directório home dos seus utilizadores ./ssh.

cat id_rsa.pub | ssh Beda@B 'cat >> .ssh/authorized_keys'

Este comando imprime o ficheiro id_rsa. pub (a sua chave pública) em authorized_keys no servidor.

IMPORTANTE: Beda é o seu nome de utilizador no servidor que está a ligar, B é o seu IP de servidor.

Agora, pode ligar-se ao servidor B sem palavra-passe ou palavra-passe:

ssh Beda@B
1
1
1
2012-08-07 15:42:41 +0000

Pergunta: O que está a causar isto, …?

  • O sshd no myserver começou a usar chaves ECDSA, então é um novo tipo de chave?
  • O myserver foi recentemente reinstalado?
  • O sshd no myserver foi recentemente reinstalado, então foi gerada uma nova chave ssh host?
  • Alguém voltou a gerar ou substituiu a chave de anfitrião sshd?
  • O endereço IP do myserver mudou para que um anfitrião diferente esteja a responder a esse endereço IP?

Pergunta: … e como é que eu o corrijo?

Como outros já responderam, remova a chave de anfitrião ECDSA em cache para o myserver que a sua conta tem em cache.

1
1
1
2012-12-20 16:47:41 +0000

O thread aqui pode ajudar.

Essencialmente, você quer remover ambas as chaves RSA e ECDSA para aquele host, então use ssh-keyscan para colocá-las de volta no seu arquivo known_hosts de uma forma que não cause este conflito. Funcionou para mim quando eu tinha o mesmo problema.

1
1
1
2017-08-25 12:43:26 +0000

Este erro continuou a incomodar-me durante muito tempo. Por alguma razão fez alguma diferença se eu faria um

ssh host

ou

ssh host.domain

https://askubuntu.com/questions/87449/how-to-disable-strict-host-key-checking-in-ssh

então apontou-me a opção de alterar o ficheiro de configuração. Veja o meu script https://askubuntu.com/a/949731/129227 ali para automatizar o processo.

0
0
0
2015-05-18 23:26:58 +0000

Fixei isto num Chromebook ao desinstalar e reinstalar o Secure Shell. Funcionou como um encanto.

0
0
0
2020-02-23 01:54:19 +0000

Ao meu lado isto acontece devido a algo que considero um bug ssh de clientes mais recentes (OpenSSH_7.9p1 e superiores), quando tenta aprender uma chave de servidor ecdsa mais segura onde já se conhece uma chave do tipo rsa mais antiga. Depois apresenta esta mensagem enganadora!

Não sei uma boa solução para isto, a única solução que encontrei foi remover todas as “boas mas velhas chaves rsa” de forma a que o cliente possa reaprender as “novas chaves ecdsa mais seguras”. Assim:

  1. O primeiro passo é remover todas as boas e velhas chaves RSA ( Aviso! Isto perde a protecção contra MitM ):

  2. O segundo passo então é reaprender todas as chaves do host, o que deve ser feito manualmente ligando-se novamente a cada IP usando ssh.


Aqui está o que eu observo:

$ sftp test@136.243.197.100
Connected to test@136.243.197.100
sftp> 

$ sftp test@valentin.hilbig.de
Connected to test@valentin.hilbig.de.
sftp>

Agora tente ligar-se a um pseudónimo recentemente introduzido deste mesmo já conhecido bom servidor:

$ sftp test@gcopy.net
Warning: the ECDSA host key for 'gcopy.net' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:44
Are you sure you want to continue connecting (yes/no)?

Por favor dê uma olhada no endereço IP. É o mesmo IP que o anterior! Então parece que a (boa) chave do (conhecido) IP de repente se está a ofender (não está, pois o cliente ssh mistura duas chaves incompatíveis, veja abaixo).

Agora tentamos corrigi-lo:

$ ssh-keygen -R 136.243.197.100
# Host 136.243.197.100 found: line 45
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old

Vamos tentar novamente:

$ sftp test@gcopy.net
Warning: Permanently added the ECDSA host key for IP address '136.243.197.100' to the list of known hosts.
Connected to test@gcopy.net.

$ sftp test@valentin.hilbig.de
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
Are you sure you want to continue connecting (yes/no)?

WTF? O que aconteceu aqui? A nova chave nova aprendida com o servidor falhou novamente? E o problema até mudou de lado?!?

Não, não é a chave, nem o servidor. Está tudo correcto!

É o cliente ssh que não verifica a chave correcta! A entrada 45 em known_hosts agora tem uma chave do tipo ecdsa-sha2-nistp256 enquanto a chave, que foi puxada do servidor pelo cliente, é do tipo rsa-sha2-512 (e por isso não pode corresponder à outra chave!).

$ sftp -v test@valentin.hilbig.de

mostra:

debug1: kex: host key algorithm: rsa-sha2-512
$ sftp -v test@gcopy.net

mostra:

debug1: kex: host key algorithm: ecdsa-sha2-nistp256

Aparentemente o cliente ssh tem um bug algures! Não consegue lidar com uma chave de anfitrião existente em mais do que uma variante! Ou cai na armadilha de pedir uma variante desactualizada de uma chave.

Como reparar?

Não faço a menor ideia. Isto provavelmente só pode ser reparado a montante.

Mas existe uma solução manual mas desajeitada:

Tem de remover manualmente todos os vestígios da chave antiga do tipo rsa. A chave em questão é mostrada na saída, mas não está directamente marcada como o problema:

Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10

verificação:

awk 'NR==45 { print $2 }' /home/test/.ssh/known_hosts
awk 'NR==10 { print $2 }' /home/test/.ssh/known_hosts

ecdsa-sha2-nistp256
ssh-rsa

Então aqui a chave de acolhimento matching é a chave ofensiva e a chave ofensiva é a chave correcta que deve ser mantida! Portanto, vamos remover a errada (correspondência):

ssh-keygen -R valentin.hilbig.de
# Host valentin.hilbig.de found: line 10
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old

Agora verifique novamente:

$ sftp test@valentin.hilbig.de
The authenticity of host 'valentin.hilbig.de (136.243.197.100)' can't be established.
ECDSA key fingerprint is SHA256:tf7lwe10C2p1lK2UG9p//m/4sUBCpX+i9k5Ub63c6Os.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'valentin.hilbig.de' (ECDSA) to the list of known hosts.
Connected to test@valentin.hilbig.de.
sftp> 

$ sftp test@gcopy.net
Connected to test@gcopy.net.
sftp> 

sftp test@136.243.197.100
Connected to test@136.243.197.100.
sftp>

YAY! O problema finalmente desapareceu. Mas com várias 100 entradas em .ssh/known_hosts, esta “solução” torna-se realmente um grande PITA (e um Pesadelo de Segurança Pronto a Errar na Elm Street. YMMV.)

0
0
0
2017-07-24 07:55:39 +0000

Veja aqui como remover uma impressão digital conhecida do anfitrião (do ficheiro known_hosts) num SO Chrome:

Encontre o índice da entrada do anfitrião ofensivo na saída ssh quando a ligação falhar. Por exemplo, na linha abaixo do índice ofensivo está 7 :

Offending ECDSA key in /.ssh/known_hosts:7

Abra o console JavaScript (CTRL+Shift+J) da janela Secure Shell e digite o seguinte, substituindo INDEX pelo valor apropriado (por exemplo 7 ):

term_.command.removeKnownHostByIndex(INDEX);

Esta solução foi emprestada de Leo Gaggl’s Blog .