从已知主机中删除密钥


129

在过去的几周中,我构建了几个虚拟机。问题是,在中间警告中.ssh/known_hosts给了男人。发生这种情况是因为另一个指纹与虚拟机IP相关联。

.ssh/known_hosts但是,在该文件中,我找不到与IP相关的记录,只有两个奇怪的,类似键的字符串和“ ssh-rsa”。

是否有人对如何从中删除旧密钥有任何想法known_hosts


7
您所指的“ bizarre,类似键的字符串”是散列的主机/ ip地址。此安全功能有助于阻止入侵者知道您有权访问哪些系统。如果看到此消息,则说明您的ssh_config已HashKnownHosts yes设置。
Deebster 2014年

1
如果您觉得文件内容太混乱,则可能已激活换行。停用它。所有行均以主机名或IP地址开头。
丹尼尔·B

Answers:


89
sed -i '6d' ~/.ssh/known_hosts

将修改文件〜/ .ssh / known_hosts:6,删除第六行。

我认为,ssh-keygen -R对于openshsh高级用户而言,使用是更好的解决方案,而您的常规Linux管理员最好使用上述方法来使他/她的sed技能保持最新。


18
如果您有官方的配置文件,我认为手动编辑配置文件不是一个好建议。冒险并不能使您成为专业人士,而找到最快,最安全的选择却可以。这就像告诉人们继续前进,编辑/etc/sudoers没有visudo。如果您想提高自己的sed技能,请继续做下去而不会使系统混乱。
kraxor 2014年

2
“如果你有那一个官方应用程序” =>都ssh-keygen -Rsed -i {line}d相当“官方”,都将在可预见的未来。Util ssh-keygen允许按行号删除,两者都是完全可以接受的(因为与处理现代数据中心主机名相比,行号通常更易于处理,并且更不易出错)。
迈克尔

2
A)特别是删除第6行,都是非常“看不见的手”。完全没有解释文件第六行的重要意义!B)还man ssh-keygen提到ssh-keygen -R hostname 您刚才说ssh-keygen -R的没有指定主机名,也没有解释您的意思。
barlop

123

最简单的解决方案是:

rm -f .ssh/known_hosts

ssh将再次重新创建文件,但是您将丢失对其他主机的密钥检查!

或者,您可以使用:

ssh-keygen -R "hostname"

或ssh“ man-in-the-middle”消息应指示known_hosts文件的哪一行具有令人讨厌的指纹。编辑文件,跳至该行并将其删除。


55
ssh-keygen -R hostname也会工作。
grawity

6
如果我们删除该文件,其他键也将删除。
shgnInc 2014年

16
删除文件是一个坏建议,就像告诉某人购买新PC,因为旧PC的鼠标坏了。手动编辑可以由官方应用程序编辑的文件也是一个坏主意。ssh-keygen添加该选项是因为有注释,但没有解释。我认为这个答案不应该得到如此多的批评。
kraxor 2014年

12
-1由于整个“删除整个known_hosts文件”的第一行。这是一件可怕的,可怕的,可怕的事情,应该予以删除。
Olivier Dulac 2015年

4
此解决方案是过大的。只需删除违规行。而已。
布莱克·弗雷德里克

78

-R为此有一个ssh-keygen开关()。

man ssh-keygen 读取:

-R 主机名

hostnameknown_hosts文件中删除所有属于的密钥。此选项对于删除散列主机很有用(请参阅-H上面的选项)。


8
这是最简单,最安全的方法。
鸡肉

注意:这会将known_hosts文件的权限更改为0600。如果由于任何原因拥有共享的known_hosts文件,则可能会禁用该文件的共享。
吉里·克劳达

和正确的一个。另外,我必须[localhost]:port使用方括号,因为我使用的是我猜= /的自定义端口。就像其他人所说的那样,在过渡/测试系统开发中,我也会使用no SSH密钥检查方法。
Pysis

18

该警告将告诉您已知主机文件中的确切行。

这是一个例子:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       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!

看到/home/user/.ssh/known_hosts:6零件了吗?它指定文件和行号。


10

您需要运行以下命令来解决此问题。打开终端并输入以下命令:

对于以下所有示例,只需替换-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

先前的答案中已经建议使用此方法。您能否扩展答案的不同之处?
布尔吉

@Burgi-这个答案ssh-keygen -R比到目前为止的任何其他答案提供了更多关于语法的细节。它通过示例确切地显示了您之后可以写的内容-R。因此,即使这不是一个全新的答案,这个答案也是值得的。
Yitz

@Yitz我的评论是评论的一部分。当时(18个月前),我认为这个问题需要一点帮助才能使其变得更好。
Burgi

8

您还可以使用UserKnownHostsFile和StrictHostKeyChecking标志指示ssh不要检查known_hosts文件。

例如:

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

为了易于使用,您可以对此进行别名:

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

现在,只要您确定信任服务器的证书,就可以使用粗体显示。


8
多么可怕的主意。只是因为您懒于保持~/.ssh/known_hosts最新状态而永久禁用安全层?为什么不继续使用telnet呢?“只要您有把握”-如果您有把握,那么您就不知道什么是MITM攻击,您可能应该花一些时间阅读一些好的文献。
kraxor 2014年

2
基于OP的问题,我认为这是一个有效的答案。有时您有一个要在其上创建/销毁大量VM的测试系统。(在准备RHCE考试时,我现在正在这样做。)可能没有任何安全隐患。尽管注意到安全隐患是巨大的,但我认为这不必被标记为“可怕的想法”。
里克·查塔姆


3

所有答案都是好的,但是对于真正的SSH专业人士,我们缺少如何使用端口号删除ssh签名的信息。

  • 简单的SSH主机签名删除命令:

    ssh-keygen -R example.com
    
  • 删除复杂的ssh密钥,例如,您通过非标准端口222连接到ssh:

    ssh example.com -p 222
    

您将收到警告,并且要删除此警告,您需要使用方括号冒号端口号:

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

希望这对非标准配置用户有所帮助。


正是我一直在寻找的东西。谢谢!
aexl

1

这是使用Ex编辑器的方法:

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

其中6th是警告消息中提到的电话号码。这样的一个:

/home/user/.ssh/known_hosts中IP的有害密钥:6 <== LINE NUMBER


在一般情况下,它建议使用ex非交互方式编辑文件,而不是sed,这更多的是小号 tream ED itor及其-i参数,它是一个非标准的FreeBSD扩展。


0

主机名或ip的条目应在第一列中。该警告还应列出有问题的密钥所在的行号。


0

您也可以使用rmknownhost 111 从已知主机中删除一行(111是要删除的行):

#! /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 * ""}

将其另存为rmknownhost的文件夹中PATH


与在任何给定的文本编辑器中执行此操作相比,这样做有什么好处?是否有某些理由不这样做,例如必须如何使用visudo编辑sudoers?
安迪·莱斯特

这有什么发行版?Ubuntu似乎没有它。
flickerfly

好处是它自动化且快速/它是您添加自己的一个单独的二进制文件
2013年

2
您可能只是在这里发布了脚本,而不是链接您在发布此答案当天创建的博客条目。这符合垃圾邮件恕我直言。更不用说您可以创建一个简单的别名来实现相同的结果,而无需7行长的ruby脚本。
kraxor 2014年

1
或仅将其添加到〜/ .bashrc:中,sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }然后使用进行调用sshdel [line number]。没有红宝石,没有二进制,没有后顾之忧。
rubynorails

0

它是一个文本文件。您可以使用vi(m)轻松进行编辑,只需删除相关行(dd),然后保存文件(wq)。但是,如果有特定的命令删除主机,那可能是最安全的方法。


我看不到直接在VIM中编辑文件是“不安全的”。它基于您对VIM的舒适度。尤其是使用此文件时,最大的风险就是删除过多的密钥,在这种情况下,只会再次提示您。
里克·查塔姆

我所指的“安全性”涉及1)忘记/不知道要删除其他文件(如果有)中的从属信息,以及2)偶然删除多于或少于需要的内容,从而破坏了文件。
瑞安·格里格斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.