Como corrigir o aviso sobre a chave do host ECDSA

288

Estou tentando configurar o SSH sem senha em um servidor Ubuntu ssh-copy-id myuser@myserver, mas estou recebendo o erro:

Aviso: a chave do host ECDSA para 'myserver' difere da chave do endereço IP '192.168.1.123'

O que está causando isso e como corrigi-lo? Tentei excluir o .sshdiretório na máquina remota e executar ssh-keygen -R "myserver"localmente, mas isso não resolve o erro.

Cerin
fonte
no meu caso, altero a ligação do servidor (ip) com o domínio e depois o The ECDSA host key for server has changed. Meu caminho é remover a seqüência de cache relacionada ao domínio em ~/.ssh/known_hosts. Então o ssh funciona.
Ninja

Respostas:

417

Remova a chave 192.168.1.123em cache da máquina local:

ssh-keygen -R 192.168.1.123
gravidade
fonte
14
Não funcionou para mim no recém-instalado servidor Debian no trabalho quando fazia o SSH em casa. Além disso, a resposta é bastante concisa.
Chris K
/home/wf/.ssh/known_hosts atualizado. O conteúdo original é mantido como /home/wf/.ssh/known_hosts.old "Aviso: Adicionada permanentemente a chave do host ECDSA para o endereço IP 'xxxx' à lista de hosts conhecidos." é exibido. e então parece funcionar #
Wolfgang Fahl
13
Você pode atualizar a chave em vez de removê-la. Use ssh-keyscan -t ecdsa my.server.domain >> ~/.ssh/known_hostsdepois que você não precisa verificar a nova chave na primeira conexão ao host.
1374 Alex
2
Para quem não consegue fazê-lo funcionar: eu registrei várias ocorrências do mesmo IP: 1 / o referido endereço IP (xx.xx.xx.xx), domínio (tomsihap.fr), servidor vps fornecido pelo provedor endereço (vpsxxx.ovh.net). ssh-keygen -R para cada um deles fez o trabalho.
tomsihap
Funcionou para mim, mas a confusão pode ser de qual host esse comando deve ser executado? A resposta é da que exibiu o erro. A segunda pergunta e resposta são mais óbvias, mas apenas no caso: qual endereço passar para ssh-keygen -R? O endereço que figura na instrução de erro.
Russ Bateman
63

No meu caso ssh-keygen -R ..., não consertei o aviso. Eu tinha informações extras como esta:

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

Simplesmente editei ~/.ssh/known_hostse excluí manualmente a linha 8 (a "chave incorreta"). Tentei reconectar, o host foi adicionado permanentemente e tudo ficou bem depois disso!

aardvarkk
fonte
2
Funciona como um encanto. Pode corrigir isso em uma linha com sed -e '8d' /home/myuser/.ssh/known_hosts, substituindo o número da linha 8e o nome do arquivo pelos exibidos no seu sistema.
Alex P. Miller
Meu problema com essa abordagem é que é um pouco confuso se se known_hosts:8refere a um valor indexado a zero ou não. É bom saber que é um mapeamento 1: 1 ...
Daniel F
Notei que isso acontece se você usar uma porta não padrão como 2022. Nesse caso, você precisa fazerssh-keygen -R [hostname]:2022
Alexander Malfait
Se eu excluir ~/.ssh/known_hosts, recebo a mensagem de que a autenticidade não pode ser estabelecida e "Tem certeza de que deseja continuar se conectando". Responder "sim" tenta e falha na conexão. Se eu tentar conectar pela segunda vez, recebo o mesmo erro de chave do host ECDSA com o qual comecei.
Aaron Franke
19

Eu faço varreduras entre meus computadores da LAN e minhas duas contas de hospedagem na web, então resolvi todos os tipos de probabilidades e termina com o SSH, incluindo problemas de autenticação usando ssh -vpara ver onde e o que deu errado.

Tendo acabado de resolver esse problema e não estar satisfeito com as respostas, eu queria realmente saber "por que" ...

O gatilho para o meu caso é: instalação do novo sistema operacional do servidor no trabalho e após a instalação do pacote openssh-server, um novo conjunto de chaves do host foi gerado no servidor do trabalho. Anteriormente, todos os sistemas operacionais do meu servidor eram Ubuntu e, desta vez, foram alterados para o Debian (e eu suspeito que haja uma diferença diferenciada nas permissões).

Quando todos os sistemas operacionais eram Ubuntu e eu reinstala o sistema operacional de um servidor, no primeiro SSH nele, recebo esse tipo de aviso, que eu prefiro sobre o 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.

Então eu abro ~/.ssh/known_hostsno computador iniciando o ssh, excluo essa linha, reconecto e isso 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 pouco sobre: ​​11122 é o número da porta da qual eu direciono o SSH no firewall

Eu verifiquei os backups de um antigo servidor Ubuntu e fiz uma comparação com 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, que com base nas alterações do Ubuntu recentemente, eu culparia uma atualização. A mudança do Ubuntu para o SO Linux sólido como o qual eu contei é por que instalei o Debian desta vez.

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

Chris K
fonte
2
+1 para o bom bloco de comparação lado a lado. Você poderia adicionar uma URL dizendo "A mudança do Ubuntu para longe do SO Linux sólido" significa?
bgoodr
@bgoodr é a minha opinião e apenas com base na criação do meu próprio servidor de arquivos RAID várias vezes nos últimos anos. : / Merda de resposta, mas comece a pesquisar no Google ubuntu debian servere você verá o que quero dizer.
Chris K
1
@ Chris Você, senhor, é um chefe. Obrigado pela resposta detalhada, porém concisa.
Sargas
6

O prompt ocorre sempre, porque os endereços IP mudam o tempo todo ao usar o endereçamento dinâmico. Tente usar o IP estático para adicionar a chave apenas uma vez.

Gaurav Joseph
fonte
1
Bom ponto, eu perdi onde alguém mencionou ips dinâmicos?
Chris K
6

ssh-keygen -f "/root/.ssh/known_hosts" -R 192.168.1.123

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

Jignesh Rawal
fonte
3

Adicionei as seguintes linhas ao meu ~ / .ssh / config, desabilitando assim a verificação estrita do host para todos os endereços .local. (com alocação de endereço DHCP, os endereços IP das minhas máquinas locais estão sempre mudando)

host *.local
    StrictHostKeyChecking no

Você ainda recebe o aviso, o que é bom para mim.

KimSJ
fonte
2

Você está usando o mesmo usuário para se conectar?

Se você estiver conectado a um PC local como o usuário John e conectado ao servidor B como o usuário Adolf @ B e tudo estiver OK, isso não significa que tudo estará bem se você estiver conectado ao PC local como o usuário Jane e se conectando ao servidor B como usuário Adolf @ B .

Se você deseja efetuar login no servidor B como usuário Beda do PC A sem senha, tente este comando, todos do PC A :

ssh-keygen -t rsa

Este comando gera a chave e armazena a chave no arquivo. Deixe a senha vazia.

ssh Beda@B mkdir -p .ssh

Este comando cria o diretório, se eles ainda não existirem. Caso contrário, não imprima uma mensagem de erro.

cd ~/.ssh

Este comando altera o diretório para o diretório inicial do usuário ./ssh.

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

Este comando imprime o arquivo id_rsa.pub (sua chave pública) em allowed_keys no servidor.

IMPORTANTE: Beda é o seu nome de usuário no servidor que você está conectando, B é o IP do seu servidor.

Agora, você pode se conectar ao servidor B sem uma senha ou senha:

ssh Beda@B
Petr Derian
fonte
1
Ou apenas use ssh-copy-id para preencher um arquivo allowed_keys com sua chave id_rsa.pub sem todo esse aborrecimento extra.
BlakBat 27/08/18
1

A discussão aqui pode ajudar.

Essencialmente, você deseja remover as chaves RSA e ECDSA desse host e usá ssh-keyscan-las para colocá-las novamente em seu known_hostsarquivo de uma maneira que não cause esse conflito. Funcionou para mim quando tive o mesmo problema.

Paul A Jungwirth
fonte
1

Pergunta: O que está causando isso, ...?

Portanto, a chave do host do servidor ssh mudou. O que causou a mudança? É difícil dizer. Aqui estão alguns palpites:

  • O sshd no myserver começou a usar chaves ECDSA, por isso é um novo tipo de chave?
  • O myserver foi reinstalado recentemente?
  • O sshd no myserver foi reinstalado recentemente para gerar uma nova chave de host ssh?
  • Alguém gerou novamente ou substituiu a chave do host sshd?
  • O endereço IP do myserver mudou para que um host diferente esteja respondendo a esse endereço IP?

Pergunta: ... e como faço para corrigi-lo?

Como outras pessoas já responderam, remova a chave do host ECDSA em cache do myserver que sua conta armazenou em cache.

Lars Nordin
fonte
2
Um bom conselho, mas na verdade não responde à pergunta. Nem sequer tenta responder à pergunta.
boatcoder
1

Esse erro me incomodou por muito tempo. Por alguma razão, fez diferença se eu faria uma

ssh host

ou

ssh host.domain

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

então me indicou a opção de alterar o arquivo de configuração. Veja meu script https://askubuntu.com/a/949731/129227 lá para automatizar o processo.

Wolfgang Fahl
fonte
1
Usando valores de configuração CanonicalizeHostnamee CanonicalDomainsevitaria a remoção de verificação rigorosa e faria ssh considerar host e host.domain para ser mesmo.
BlakBat
0

Corrigi isso em um Chromebook desinstalando e reinstalando o Secure Shell ... Funcionou como um encanto.

msersen
fonte
Isso é um exagero. Veja uma solução mais simples na minha resposta aqui.
Alex Yursha
0

Veja como remover uma impressão digital de host conhecida (do known_hostsarquivo) em um Chrome OS:

Encontre o índice da entrada do host incorreto na saída ssh quando a conexão falhar. Por exemplo, na linha abaixo do índice incorreto é 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 INDEXpelo valor apropriado (por exemplo, 7 ):

term_.command.removeKnownHostByIndex(INDEX);

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

Alex Yursha
fonte