尝试将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”)建议应该有某种方法可以添加正确的主机密钥而不删除旧的主机密钥。新主机密钥而不删除旧主机密钥。

这是否可能,或者错误消息是否极具误导性?

评论

这是生成错误的主机密钥。主机应该只有一个密钥。这与客户端或用户密钥无关。您是否有一个IP地址浮在不同的主机之间或其他主机之间?

以我为例,我知道我会在不久的将来在很多事情之间进行切换,同时还要摆弄一些东西。在您建议的具有多个主机的IP中,这似乎也很有用。主要是我只想知道这对我自己的教育是否可行,除了任何特定的实际应用之外。

#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)




评论


这工作了!但是,我使用的是“ HashKnownHosts”,因此该条目看起来有点不合适。幸运的是,ssh_config(5)指向ssh-keygen(1),它解释了我可以使用“ ssh-keygen -H”对未哈希的条目进行哈希处理。谢谢!

–塞缪尔·埃德温·沃德(Samuel Edwin Ward)
2011-10-13 15:49

这个“有效”,但是您没有验证密钥,因此您容易受到mitm攻击...

–贾斯珀·华莱士(JasperWallace)
2013年9月23日在7:22

@JasperWallace,只要第一步是通过安全连接(例如使用localhost)完成的,我认为它应该是非常安全的

–ony
13-10-3在20:38

有什么办法可以从服务器收集所有密钥类型?有时您不知道它们是否是RSA,DSA,ECDSA,RSA1 ...等。

– Sopalajo de Arrierez
16 Mar 4 '16 at 15:40

@SopalajodeArrierez在同一联机帮助页上还说,您可以使用逗号分隔类型,所以ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip也是如此-但是找到rsa1和dsa密钥的唯一原因是识别需要升级/重新配置

– kbolino
16年4月12日在20:31

#2 楼

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

ssh-keygen -R *ip_address_or_hostname*


这将从已知_hosts文件中删除有问题的IP或主机名,然后尝试重新连接。

从手册页中:


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


评论


“如何在不删除旧密钥的情况下添加新的主机密钥。”

–塞缪尔·埃德温·沃德(Samuel Edwin Ward)
2013年2月9日在16:29

这是最好的解决方案!

– Thomas Decaux
13年8月27日在9:41

当我在Google上搜索“ git ssh自动更新主机密钥”时,您的问题第二位。这是我一直在寻找的答案。用我想要的确切内容打开一个新问题可能会使它重复出现。

–詹森·古玛(Jason Goemaat)
2015年11月15日在12:15

主机名也可以

– Damluar
18年7月6日在20:28

这对我有用。在远程服务器上已更改的known_hosts文件中已经有一个密钥。因此,使用ssh-keygen -R * ip_address_or_hostname *删除它们的密钥后,在下次尝试连接时会自动添加新密钥。

– Riz
19年11月6日在7:26

#3 楼

一种非常简单的方法是:

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


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

ssh name@computer


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

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

EDIT 2015/06

我应该添加一下,现在重新访问一下,我注意到一种更简单的方法[只要输入是可识别的,通常是从主机名/ IP地址(除了错误消息引用其特定位置之外)];


编辑known_hosts,以在其中的“旧”条目的开头添加# br /> known_hosts临时
连接[ssh到主机],同意提示自动添加新密钥
,然后重新编辑known_hosts删除#

甚至在

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer


中还提供了HostKeyAlias选项,然后,在ssh客户端将新密钥添加到别名下之后,您可以编辑known_hosts来替代“ real”密钥。别名的stname / IP地址,或使用别名选项evermore连接到该主机的版本

评论


这种“融​​化”? meldmerge.org

–塞缪尔·埃德温·沃德(Samuel Edwin Ward)
2012年5月1日13:16

这就是融合:) apt-get / yum安装名称就是融合

–马克
2012年5月7日在6:27

我对您的建议做了一个很好的建议-代替了cp,mv,ssh,然后是cat〜/ .ssh / known_hosts.bak〜/ .ssh / known_hosts> tmp; mv tmp〜/ .ssh / known_hosts

– Peter N Lewis
17年6月30日在11:31

#4 楼

我在树莓派上遇到了相同的问题,我在几个不同的系统(用于编译arm二进制文件,项目,xbmc等的dev系统)下启动,并且遇到了相同的问题。他们在局域网上使用DHCP,而我的路由器总是重复使用相同的IP,因为MAC地址相同。我已经通过在主机文件中使用不同的域名解决了该问题:

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


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

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

$ ssh pi@10.10.10.110
$ ssh pi@010.10.10.110
$ ssh pi@10.010.10.110


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

评论


OpenSSH人士对我很明智,这个漏洞不再适用于最新版本。

–迈克
2015年12月8日,下午3:32

您可以在〜/ .ssh / config中使用CheckHostIP no来仍然可以使用漏洞。您甚至可以在此处定义别名,这样就不必摆弄/ etc / hosts并只为这3个主机名定义CheckHostIP了。

– GnP
17年4月4日在18:12

#5 楼

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

Host *
    UpdateHostKeys yes


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

评论


这是迄今为止最有用的答案!尽管它没有明确提供解决主机密钥是否已更改的原始问题的方法,但是所有其他答案都是不安全的,因为它们没有验证新的主机密钥。此选项使您可以安全地过渡到新的主机密钥。

–日本长者
17年7月5日在20:03

#6 楼

我看不到您为什么要使用两个键,但是您当然可以在~/.ssh/known_hosts文件中添加多个有效键,但是您必须手动进行操作。

另一个解决方案可能是为此特定主机使用StrictHostKeyChecking=no选项:

ssh -o StrictHostKeyChecking=no user@host


您可以将其放入~/.profile中的别名或相似的东西。

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


评论


在这种情况下,StrictHostKeyChecking似乎没有帮助;显然,它仅在主机不在known_hosts文件中时指定行为。此处提及:gossamer-threads.com/lists/openssh/dev/45349#45349

–塞缪尔·埃德温·沃德(Samuel Edwin Ward)
2011-10-13 15:41



它在这里工作。您将收到警告,但登录将继续。

– Sven
2011年10月13日15:53

真奇怪您正在使用密码验证吗?您在使用OpenSSH吗?

–塞缪尔·埃德温·沃德(Samuel Edwin Ward)
2011年10月13日在16:07

#7 楼

如果您仅通过SSH连接到本地网络,那么...

一种简单的解决方案是擦除旧密钥文件,然后将其替换为空白密钥文件。这将允许您使用新密钥重新授权所有连接。如果您为本地网络外部的站点存储了ssh密钥,则需要确保初始连接的安全性与第一次连接到该服务器时一样。

例如

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts


然后按空格键,退格cntl + x和'y'保存新的缓冲区(文件)。这是一种不好的做法,但是可以的做法是,只要您不定期在本地网络(例如uni或工作服务器)之外进行SSH操作,就可以了。中间攻击。

使用您理解的代码总是更好!

评论


每次清除整个known_hosts文件将使ssh否则提供的大多数安全性无效。

–卡巴斯德
14年6月15日在22:23

的确,我会说,在安全的内部网络上,理解代码和规避安全性比盲目复制代码更安全。在外部网络上,情况将有所不同。

–亚伦
2014年6月30日20:50

#8 楼

您需要从客户端服务器上删除旧密钥
ssh-keygen -R 192.168.0.25 #1st remove on client server

,然后重新生成密钥
ssh -o HostKeyAlias=192.168.0.25 root@192.168.0.25 #on client server

检查是否有新行
nano ~/.ssh/known_hosts


#9 楼

答案如此之多,但有那么多的答案,它们通过完全关闭严格的主机检查,破坏销毁无关的主机信息或只是迫使用户以交互方式接受密钥来放弃保护,这可能在以后的某个时刻出现。 br />这是一种简单的技术,可让您保留严格的主机检查功能,但当您希望更改密钥时,以受控方式更新密钥:



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

ssh-keygen -R server.example.com && \
    ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.


如果使用IP地址或其他主机名,请重复此操作。

这种方法的优势在于,它仅对服务器进行一次密钥更新。如果您尝试删除的服务器在已知的主机文件中不存在,则大多数版本的ssh-keygen似乎都不会返回错误,如果这对您来说是个问题,请依次使用这两个命令。

这种方法还可以验证连接性,并在ssh命令中向日志发出漂亮的消息(登录,更新主机密钥并输出已更新的SSH主机密钥,然后立即退出。

如果您的版本ssh-keygen返回一个非零的退出代码,并且您希望无错误地处理此代码,无论是先前连接还是先前连接,只需依次使用这两个命令,而忽略ssh-keygen命令上的任何错误。

如果您使用此技术,则无需更改ssh命令,也无需关闭主机检查,除非在执行该ssh命令期间,否则可以确保以后的ssh会话可以正常工作,而无需冲突或需要明确接受新密钥,例如只要上面的ssh命令运行无误。

#10 楼

我遇到了同样的问题。

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

当我SSH返回服务器时,它添加了一个新密钥。

评论


有关为什么会发生这种情况的更多信息将对答案有所帮助。

–德鲁·科里(Drew Khoury)
2014年5月18日14:56

#11 楼

使用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-keygen -R <hostname|ip address>


它将删除主机名条目,并将旧的.known_host备份为known_hosts.old

评论


“但是我想让ssh接受旧密钥和新密钥。”您的答案不这样做。

–塞缪尔·埃德温·沃德(Samuel Edwin Ward)
2012年6月14日15:42