“在known_hosts 中添加正确的主机密钥”/每个主机名有多个ssh 主机密钥?

Sam*_*ard 179 ssh ssh-keys

尝试通过 ssh 连接到我控制的计算机时,我收到了熟悉的消息:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[...].
Please contact your system administrator.
Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA host key for [...] has changed and you have requested strict checking.
Host key verification failed.
Run Code Online (Sandbox Code Playgroud)

我确实更改了密钥。我读了几十篇帖子,说解决这个问题的方法是从known_hosts文件中删除旧密钥。

但我想要的是让 ssh 接受旧密钥和新密钥。错误消息 (" Add correct host key") 中的语言表明应该有某种方法可以添加正确的主机密钥而不删除旧的主机密钥。

我一直无法弄清楚如何在不删除旧密钥的情况下添加新的主机密钥。

这是可能的,还是错误消息极具误导性?

qua*_*nta 169

  1. 获取您服务器的 rsa 密钥,您server_ip的服务器的 IP 地址在哪里,例如192.168.2.1

    $ ssh-keyscan -t rsa server_ip
    
    Run Code Online (Sandbox Code Playgroud)

    示例响应:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在客户端,复制整个响应行server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...,并将此键添加到~/.ssh/known_hosts文件底部:

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key, and/or the very bottom of the `known_hosts` file)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... (line you're adding, copied and pasted from above)
    
    Run Code Online (Sandbox Code Playgroud)

  • 这有效!但是,我使用的是“HashKnownHosts”,因此该条目看起来有点不合适。幸运的是 ssh_config(5) 将我指向 ssh-keygen(1),它解释说我可以使用“ssh-keygen -H”来散列未散列的条目。谢谢! (13认同)
  • @JasperWallace,只要第一步是通过安全连接(例如使用本地主机)完成的,它就应该非常安全,我认为 (3认同)
  • 有没有办法从服务器收集所有密钥类型?有时您不知道它们是 RSA、DSA、ECDSA、RSA1 等。 (3认同)
  • @SopalajodeArrierez 同一个手册页还说你可以用逗号分隔类型,`ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip` 也是如此——但找到 `rsa1` 和 `dsa` 键的唯一原因是识别需要升级/重新配置的服务器 (3认同)
  • 这“有效”,但您没有验证密钥,因此您很容易受到 mitm 攻击...... (2认同)

小智 122

使用以下命令从 known_hosts 中删除该条目:

ssh-keygen -R *ip_address_or_hostname*
Run Code Online (Sandbox Code Playgroud)

这将从known_hosts文件中删除有问题的 IP 或主机名,然后再次尝试连接。

从手册页:

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

  • “如何在不删除旧密钥的情况下添加新的主机密钥。” (13认同)
  • 这是最好的解决方案! (4认同)
  • 当我谷歌搜索“git ssh 自动更新主机密钥”时,您的问题第二次出现。这个答案是我一直在寻找的。用我想要的确切内容打开一个新问题可能会将其作为重复项关闭。 (2认同)

Mar*_*ark 22

一个非常简单的方法是:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak
Run Code Online (Sandbox Code Playgroud)

然后编辑 known_hosts 以清除原始密钥,然后使用以下命令 ssh 到主机:

ssh name@computer
Run Code Online (Sandbox Code Playgroud)

它会自动添加新密钥;然后比较这两个文件。meld 之类的程序是比较两个文件的好方法。然后合并文件以使 known_hosts 包含两个密钥

我保留两个密钥的“原因”是目标系统是多重引导,尽管我敢说有一种跨安装同步密钥的方法,但允许多个密钥似乎更直接。

编辑2015/06

我应该补充一下,现在重新审视它,我注意到一种更简单的方法 [只要条目是可识别的,通常是从主机名/IP 地址而不是引用其特定位置的错误消息];

  1. 编辑 known_hosts 以在 known_hosts 中的“旧”条目的开头临时添加 #
  2. 连接【ssh 到主机】,同意提示“自动”添加新密钥
  3. 然后重新编辑 known_hosts 以删除 #

甚至还有 HostKeyAlias 选项

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer
Run Code Online (Sandbox Code Playgroud)

然后随后,在 ssh 客户端在别名下添加新密钥后,您可以编辑 known_hosts 以替换别名的“真实”主机名/IP 地址,或者使用别名选项永远连接到该主机的化身


小智 6

我在使用多个不同系统(用于编译 arm 二进制文件、项目、xbmc 等的开发系统)启动的 raspberry pi 上遇到了同样的问题,并且遇到了同样的问题。他们在本地网络上使用 DHCP,而我的路由器总是重复使用相同的 IP,因为 MAC 地址是相同的。我已经通过在我的主机文件中使用不同的域名解决了这个问题:

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc
Run Code Online (Sandbox Code Playgroud)

known_hosts 文件按主机名保存指纹,因此即使它是相同的 IP 地址,每个唯一的主机名也会获得不同的条目。

每次使用新系统时,我都厌倦了将名称添加到主机文件中,因此我想出了一种更懒惰的方法,即在 IP 地址上使用前导零,例如:

$ ssh pi@10.10.10.110
$ ssh pi@010.10.10.110
$ ssh pi@10.010.10.110
Run Code Online (Sandbox Code Playgroud)

(未规范化的)IP 地址的每个变体在 known_hosts 中都有自己的条目。


小智 6

如果您的客户端和服务器都有 OpenSSH 6.8 或更高版本,您可以使用或UpdateHostKeys yes中的选项。例如:ssh_config~/.ssh/config

Host *
    UpdateHostKeys yes
Run Code Online (Sandbox Code Playgroud)

这使得 SSH 存储服务器必须存储的所有主机密钥known_hosts,并且当服务器更改或删除一个主机密钥时,该密钥也会在您的known_hosts.