从 known_hosts 中删除密钥

Ada*_*tan 202 ssh openssh hosts man-in-the-middle

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

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

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

Sea*_*ats 177

最简单的解决方案是:

rm -f .ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以使用:

ssh-keygen -R "hostname"
Run Code Online (Sandbox Code Playgroud)

或者 ssh 的“中间人”消息应该指出 known_hosts 文件的哪一行具有违规指纹。编辑文件,跳转到该行并删除它。

  • `ssh-keygen -R hostname` 也可以使用。 (84认同)
  • 删除文件是一个糟糕的建议,就像告诉某人购买一台新电脑,因为旧电脑的鼠标坏了。手动编辑可由官方应用程序编辑的文件也是一个坏主意。由于注释而添加了 `ssh-keygen` 选项,但没有解释。我认为这个答案不值得这么多赞。 (38认同)
  • -1 因为整个“删除整个 known_hosts 文件”的第一行。这是一个可怕的、可怕的、可怕的提议,应该被删掉。 (20认同)
  • 如果我们删除该文件,其他键也将删除。 (11认同)
  • 这个解决方案是矫枉过正的。只需删除违规行。就是这样。 (8认同)

小智 165

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

man ssh-keygen 读到:

-R 主机名

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

  • 这是最简单、最安全的方法。 (17认同)

mik*_*ers 106

sed -i '6d' ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

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

在我看来,使用ssh-keygen -R对于 openssh 高级用户来说是一个更好的解决方案,而您的普通 Linux 管理员可以通过使用上述方法更好地保持他/她的 sed 技能。

  • 如果您有官方应用程序,我认为手动编辑配置文件不是一个好建议。冒险并不能使您成为专家,找到最快捷、最安全的选择才可以。这就像告诉人们在没有 `visudo` 的情况下继续编辑 `/etc/sudoers`。如果您想提高您的“sed”技能,请继续这样做,而不要弄乱您的系统。 (31认同)
  • A) 特别是第 6 行的删除,都是非常“不看手”的。完全没有解释文件的第 6 行有什么重要意义?!B) 还有 `man ssh-keygen` 提到了 `ssh-keygen -R hostname`,你刚才说的 `ssh-keygen -R` 没有指定主机名,你还没有解释你的意思。 (4认同)
  • “如果你有一个正式的应用程序” => `ssh-keygen -R` 和 `sed -i {line}d` 都是非常“官方的”,并且在可预见的未来都可以使用。Util ssh-keygen 允许按行号删除,两者都是完全可以接受的(因为与处理现代数据中心主机名相比,行号通常更容易处理,并且不易出错)。 (2认同)

小智 25

您需要运行以下命令来摆脱这个问题。打开终端并输入以下命令:

对于下面的所有示例,只需替换 之后的值-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
Run Code Online (Sandbox Code Playgroud)

  • @Burgi - 这个答案比迄今为止的任何其他答案都提供了有关“ssh-keygen -R”语法的更多详细信息。它通过示例准确显示了在“-R”之后可以写什么。所以这个答案是值得的,尽管它不是一个全新的答案。 (5认同)

inn*_*naM 20

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

下面是一个例子:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       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!
Run Code Online (Sandbox Code Playgroud)

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


Aru*_*ius 14

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

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

    ssh-keygen -R [example.com]:222
Run Code Online (Sandbox Code Playgroud)

请注意,可能会有同一主机的 IP 记录,因此您还需要删除该记录。

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


rou*_*ble 9

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

例如:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com
Run Code Online (Sandbox Code Playgroud)

为了便于使用,您可以将其别名为:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
Run Code Online (Sandbox Code Playgroud)

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

  • 多么可怕的想法。仅仅因为你懒得让你的`~/.ssh/known_hosts` 保持最新而永久禁用安全层?为什么不直接使用`telnet`?“只要你确定”——如果你确定,那么你不知道什么是 MITM 攻击,你可能应该花一些时间阅读一些好的文献。 (11认同)
  • 基于 OP 的问题,我认为这是一个有效的答案。有时,您有一个测试系统,您要在其上创建/销毁大量 VM。(我现在正在准备 RHCE 考试。)这可能没有任何安全隐患。虽然注意到安全隐患很大,但我认为不必将其标记为“可怕的想法”。 (2认同)