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

试图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. 

我确实改变了关键。 我读了几十个post,说解决这个问题的方法是从known_hosts文件中删除旧密钥。

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

我一直没能弄清楚如何添加新的主机密钥而不删除旧的。

这是可能的,还是错误信息只是非常误导?

  1. 获取服务器的rsa密钥:

     $ ssh-keyscan -t rsa server_ip # server_ip SSH-2.0-OpenSSH_4.3 server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... 
  2. 并在客户端上,将此密钥添加到~/.ssh/known_hosts

     server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key) server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... 

删除来自known_hosts的条目,使用:

 ssh-keygen -R *ip_address_or_hostname* 

这将从known_hosts文件中删除有问题的IP或主机名,并尝试重新连接。

从手册页:

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

一个非常简单的方法是:

 cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak 

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

 ssh name@computer 

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

我保留两个密钥的“理由”是目标系统是多重启动的,即使我敢说在安装过程中有一种同步密钥的方法,但允许多个密钥似乎更直接。

编辑 2015/06

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

  1. 编辑known_hosts以在临时的known_hosts中的“old”条目的开始处添加#
  2. 连接[SSH到主机],同意提示添加新的密钥“自动”
  3. 然后重新编辑known_hosts以删除#

甚至有HostKeyAlias选项

 ssh -o HostKeyAlias=mynewaliasforthemachine name@computer 

那么随后,在ssh客户机在别名下面添加新密钥之后,可以编辑known_hosts来replace别名的“真实”主机名/ IP地址,或者使用别名选项连接到该主机的那个化身

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

 10.10.10.110 pi-dev 10.10.10.110 pi-xbmc 10.10.10.110 pi-etc 

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

每当我使用一个新的系统时,我厌倦了为主机文件添加名称,所以我想出了一个更加懒惰的方式,通过在ip地址上使用前导零:

 $ ssh [email protected] $ ssh [email protected] $ ssh [email protected] 

(uncanonicalized)ip地址的每一个变化得到它自己在known_hosts条目。

我不明白你为什么要用两个键来工作,但是你可以给~/.ssh/known_hosts文件添加多个有效的键,但是你必须手动完成。

另一种解决scheme可能是对这个特定主机使用StrictHostKeyChecking=no选项:

 ssh -o StrictHostKeyChecking=no user@host 

你可以把它放在你的~/.profile或类似的别名中。

 alias hc=ssh -o StrictHostKeyChecking=no user@host 

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

 Host * UpdateHostKeys yes 

这使得SSH将所有主机密钥存储到服务器的所有主机密钥中,当服务器更改或删除一个主机密钥时,密钥也会在known_hosts更改或删除。

如果你 ssh到本地networking然后…

一个简单的解决scheme是擦拭旧的密钥文件,并将其replace为空白的文件。 这将允许您使用新密钥重新授权所有连接。 如果您的本地networking之外的站点存储了ssh密钥,则需要确保初次连接是安全的,就像您第一次连接到该服务器时一样。

例如

 cp known_hosts known_hosts.old rm known_hosts nano known_hosts 

然后按空格,退格cntl + x和'y'保存新的缓冲区(文件)。 它不好的做法,但可以提供你不经常ssh'ing以外的本地networking(例如单一或工作服务器)

在安全的本地networking上,这是安全的,因为你只是不能让一个人在中间的攻击。

它总是更好地使用你明白的代码!

这么多的答案,但太多,放弃保护,closures严格的主机检查,或摧毁无关的主机信息,或只是强迫用户交互接受密钥,可能在稍后的时候,当意外。

这里有一个简单的技巧,可以让你离开严格的主机检查,但是当你期望它改变的时候,以一种受控的方式更新这个键:

  • 删除旧密钥并在一个命令中更新

     ssh-keygen -R server.example.com && \ ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated. 
  • 重复使用IP地址或其他主机名称。

这种方法的优点是它重新键入服务器一次。 如果您尝试删除的服务器不存在于已知主机文件中,那么大多数ssh-keygen版本似乎都不会返回错误,如果这对您是个问题,请按顺序使用这两个命令。

这种方法还validation连接性,并发出一个很好的消息,以logging在SSH命令(login,更新主机密钥,并输出SSH主机密钥更新,然后立即退出。

如果你的ssh-keygen版本返回一个非零的退出代码,并且你更愿意处理这个没有错误,无论是否连接,只要简单地使用这两个命令,忽略ssh-keygen命令上的任何错误。

如果你使用这种技术,你永远不需要改变你的ssh命令,或者closures主机检查,除了那一个ssh命令。 只要上面的ssh命令没有错误地运行,你可以确定将来的ssh会话不会发生冲突,也不需要明确地接受一个新的密钥。

使用: ssh-keygen -R "hostname|ip address"

它将删除主机条目并将known_hosts的备份logging为known_hosts.old

我有同样的问题。

我所做的只是sudo nano /home/user/.ssh/ host_allow并删除了密钥。

当我ssh回到服务器,它添加了一个新的密钥。

使用sed命令删除有问题的行

 OUTPUT: as show in above example Offending key in /home/user/.ssh/known_hosts:86 

删除已知主机中提到的第86行。

 CODE: sed -i '86d' /home/user/.ssh/known_hosts 

下次使用ssh访问时,系统会自动添加新的密钥。

更新的版本的SSH

使用:

 ssh-keygen -R <hostname|ip address> 

它将删除主机名条目并将.known_host备份.known_hostknown_hosts.old

如果你是一个mac用户,你可以使用sudo ssh user@serverinput你的密码..一切都好! 我只是试了一下,解决了我的问题