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


146

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

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

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


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

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

Answers:


147
  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...
    
  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)
    

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

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

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

3
有什么办法可以从服务器收集所有密钥类型?有时候,你不知道他们是RSA,DSA,ECDSA,RSA1 ...等等
Sopalajo德Arrierez

3
@SopalajodeArrierez相同的联机帮助页还说您可以用逗号分隔类型,ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip但是可以这样做-但查找rsa1dsa键的唯一原因是识别需要升级/重新配置的服务器
kbolino

93

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

ssh-keygen -R *ip_address_or_hostname*

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

从手册页:

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


11
“如何在不删除旧密钥的情况下添加新的主机密钥。”
塞缪尔·埃德温·沃德

4
这是最好的解决方案!
Thomas Decaux

8
怎么有19票?它不来接近回答提出的问题..
Molomby

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

主机名也起作用
damluar

18

一个非常简单的方法是:

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以将“真实”主机名/ IP地址替换为别名,或者使用alias选项连接到该主机的化身。


这种“融​​化”?meldmerge.org
塞缪尔·埃德温·沃德,

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

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

6

我在树莓派上遇到了同样的问题,我在几个不同的系统(用于编译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中都有其自己的条目。


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

您可以使用CheckHostIP no~/.ssh/config仍然可以使用漏洞。你甚至可以定义你的别名有那么你不必乱动/etc/hosts,并确定CheckHostIP no只此3个主机名。
GnP

3

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

Host *
    UpdateHostKeys yes

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


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

1

我不明白为什么要使用两个键,但是可以向该~/.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
塞缪尔·埃德温·沃德,

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

真奇怪 您正在使用密码验证吗?您在使用OpenSSH吗?
塞缪尔·埃德温·沃德

1

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

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

例如

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

然后按空格键,退格键cntl + x和'y'保存新缓冲区(文件)。这是一种不好的做法,但是可以的前提是您不必定期在本地网络(例如uni或工作服务器)之外进行ssh交换

在安全的本地网络上,这是安全的,因为您根本无法在中间攻击中招到一名男子。

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


4
known_hosts每次擦除整个文件将使ssh所提供的大多数安全性无效。
kasperd

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

-1

答案如此之多,但是却有太多的答案,它们通过完全关闭严格的主机检查,破坏不相关的主机信息或只是迫使用户以交互方式接受密钥来放弃保护,可能是在以后发生的意外情况下。

这是一种简单的技术,可让您保留严格的主机检查功能,但在您希望更改密钥时以受控方式更新密钥:

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

    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会话就可以正常工作而不会发生冲突或需要显式接受新密钥。


-3

我有同样的问题。

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

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


2
有关为什么会发生这种情况的更多信息将有助于解答。
Drew Khoury 2014年

-4

使用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_hosts.old


4
“但是我想让ssh接受旧密钥和新密钥。” 您的答案不这样做。
Samuel Edwin Ward
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.