2009-08-26 16:00:30 +0000 2009-08-26 16:00:30 +0000
140
140

Remova a chave de hospitais conhecidos

Construí várias máquinas virtuais durante as últimas semanas. O problema é que o .ssh/known_hosts dá-me o aviso Man in the middle . Isto acontece porque outra impressão digital está associada ao IP da máquina virtual.

No ficheiro .ssh/known_hosts, no entanto, não encontro o registo relacionado com o IP, apenas duas cordas bizarras, tipo chave e “ssh-rsa”.

Alguém tem alguma ideia sobre como remover a chave antiga do known_hosts?

Respostas (11)

139
139
139
2009-08-26 16:11:22 +0000

A solução mais simples é:

rm -f .ssh/known_hosts

ssh vai recriar o ficheiro novamente, mas perde a verificação da chave para outros anfitriões!

Ou, pode usar:

ssh-keygen -R "hostname"

Ou a mensagem ssh “man-in-the-middle” deve indicar qual a linha do ficheiro de anfitriões conhecidos_ tem a impressão digital ofensiva. Edite o ficheiro, salte para essa linha e apague-a.

91
91
91
2010-07-02 17:56:38 +0000
sed -i '6d' ~/.ssh/known_hosts

Modificará o ficheiro ~/.ssh/known_hosts:6 , removendo a 6ª linha.

Na minha opinião, utilizar ssh-keygen -R é uma solução melhor para um utilizador com poder openssh, enquanto que o seu administrador normal do Linux faria melhor em manter as suas capacidades de sed fresco, utilizando o método acima descrito.

89
89
89
2013-02-22 18:41:50 +0000

Existe um interruptor ssh-keygen (-R) para isto.

man ssh-keygen diz:

-R hostname

Remove todas as chaves pertencentes a hostname de um ficheiro known_hosts. Esta opção é útil para apagar hosts hashed (ver a opção -H acima).

18
18
18
2009-08-26 16:17:33 +0000

O aviso indicar-lhe-á a linha exacta no ficheiro de anfitriões conhecido.

Aqui está um exemplo:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Veja a parte /home/user/.ssh/known_hosts:6? Especifica o ficheiro e o número da linha.

11
11
11
2016-05-28 09:28:08 +0000

Tem de executar o seguinte comando para se livrar deste problema. Abra o terminal e digite o seguinte comando:

Para todos os exemplos abaixo basta substituir o valor após -R

ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com
8
8
8
2014-03-12 16:05:22 +0000

Pode também instruir o ssh para não verificar o ficheiro conhecido_hosts usando as bandeiras UserKnownHostsFile e StrictHostKeyChecking.

Por exemplo:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

Para facilidade de utilização, pode chamar-lhe assim:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Agora pode simplesmente boldssh sempre que tiver a certeza que confia no certificado do servidor.

4
4
4
2018-05-16 08:03:38 +0000

Todas as respostas são boas, mas para um verdadeiro profissional SSH faltam informações de como remover a assinatura ssh com o número da porta.

  • Comando simples de remoção da assinatura do host SSH:

  • Remoção da chave ssh complexa, por exemplo, liga-se ao ssh na porta não padrão 222:

e recebe um aviso, e para remover isto, precisa de usar parênteses rectos com o número da porta:

ssh-keygen -R [example.com]:222

Espero que isto ajude os utilizadores de configurações não padrão.

1
1
1
2019-10-09 16:59:56 +0000

Aqui está um método que utiliza o editor Ex:

ex +6d -scwq ~/.ssh/known_hosts

onde o 6º é o seu número de linha mencionado na mensagem de aviso. Como este:

Offending key for IP in /home/user/. ssh/known_hosts:6 <== LINE NUMBER


Em geral, é aconselhável usar ex para editar os ficheiros de forma não-interactiva , em vez de sed, que é mais uma S* tream ED itor e o seu parâmetro -i que é uma extensão FreeBSD não-padrão.

0
0
0
2010-06-22 16:32:09 +0000

Pode também remover uma única linha de hosts conhecidos com, por exemplo, rmknownhost 111 (111 é a linha a remover):

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

Guarde isto como rmknownhost numa pasta do seu PATH.

0
0
0
2009-08-26 16:13:25 +0000

A entrada relativa ao nome do anfitrião ou ip deve constar da primeira coluna. O aviso deve também indicar um número de linha onde se encontra a chave infractora.

0
0
0
2014-06-27 13:23:54 +0000

Trata-se de um ficheiro de texto. Pode facilmente editar com o vi(m) e simplesmente apagar a linha em questão (dd), e guardar o ficheiro (wq). Mas se existe um comando específico para remover um host, esse é provavelmente o método mais seguro.