当我尝试通过 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.
我确实更改了密钥。我读了几十篇帖子,说解决这个问题的方法是从文件中删除旧密钥known_hosts
。
但我希望 ssh 既接受旧密钥也接受新密钥。错误消息(“ Add correct host key
”)中的语言表明应该有某种方法可以添加正确的主机密钥而无需删除旧密钥。
我一直无法弄清楚如何在不删除旧主机密钥的情况下添加新主机密钥。
这是可能的吗,或者错误信息只是极具误导性?
答案1
获取服务器的 rsa 密钥,其中
server_ip
是服务器的 IP 地址,例如192.168.2.1
:$ ssh-keyscan -t rsa server_ip
示例响应:
# server_ip SSH-2.0-OpenSSH_4.3 server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
并在客户端上复制整个响应行
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)
答案2
使用以下命令从 known_hosts 中删除该条目:
ssh-keygen -R *ip_address_or_hostname*
这将从已知主机文件并尝试再次连接。
从手册页中:
-R hostname
从 known_hosts 文件中删除属于 hostname 的所有键。此选项对于删除散列主机很有用(请参阅上面的 -H 选项)。
答案3
一个非常简单的方法是:
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak
然后编辑known_hosts以清除原始密钥,然后使用以下命令 ssh 到主机:
ssh name@computer
它会自动添加新密钥;然后比较这两个文件。meld 之类的程序是比较这两个文件的好方法。然后合并文件以使 known_hosts 包含这两个密钥
我保留两个密钥的“原因”是目标系统是多重引导的,尽管我敢说有一种方法可以在安装之间同步密钥,但允许多个密钥似乎更简单。
编辑2015/06
我应该补充一点,现在重新审视它,我注意到一种更简单的方法[只要条目是可识别的,通常是从主机名/ IP 地址,而不是引用其特定位置的错误消息];
- 编辑 known_hosts,暂时在 known_hosts 中的“旧”条目开头添加 #
- 连接[ssh到主机],同意提示“自动”添加新密钥
- 然后重新编辑known_hosts以删除#
甚至还有 HostKeyAlias 选项,如下所示
ssh -o HostKeyAlias=mynewaliasforthemachine name@computer
然后,在 ssh 客户端在别名下添加新密钥后,您可以编辑 known_hosts 以将别名替换为“真实”主机名/IP 地址,或者使用别名选项 evermore 连接到该主机的该化身
答案4
我在使用几个不同的系统(用于编译 arm 二进制文件的开发系统、项目、xbmc 等)启动的 raspberry pi 上遇到了同样的问题,并且遇到了同样的问题。它们在本地网络上使用 DHCP,而我的路由器总是重复使用相同的 IP,因为 MAC 地址相同。我通过在 hosts 文件中使用不同的域名解决了这个问题:
10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc
known_hosts 文件按主机名保存指纹,因此即使是相同的 IP 地址,每个唯一的主机名也会获得不同的条目。
每次使用新系统时,我都厌倦了将名称添加到 hosts 文件中,因此我想出了一个更懒惰的方法,即在 ip 地址上使用前导零,例如:
$ ssh [email protected]
$ ssh [email protected]
$ ssh [email protected]
(非规范化的) IP 地址的每个变体在 known_hosts 中都有自己的条目。