SSH连接问题,“主机密钥验证失败...”错误


179

我可以通过SSH连接到局域网中的另一台Ubuntu计算机。在当时的两台PC上,我都安装了openssh-server, 但是从另一台Ubuntu计算机上,我无法通过SSH连接到PC,但出现此错误:

主机密钥验证失败...


1
您使用主机名还是IP地址?
托尔比约恩Ravn的安徒生

不相似的,但我得到了同样的错误,但由于不同的问题:serverfault.com/questions/494916/...
zengr

这不是Ubuntu特有的问题。可以ssh通过命令行执行任何操作。
MarkHu '17

Answers:


216

“主机密钥验证失败”表示远程主机的主机密钥已更改。

SSH将远程主机的主机密钥存储在中~/.ssh/known_hosts。您可以手动编辑该文本文件并删除旧键(您可以在错误消息中看到行号),也可以使用

ssh-keygen -R hostname

手册页

-R主机
名从known_hosts文件中删除所有属于主机名的键。此选项对于删除散列主机很有用。

(这是我从“ 是否可以从SSH的known_hosts文件中删除特定主机密钥?”的答案中学到的


4
这也可能意味着您根本没有远程主机的主机密钥。例如,如果I rm ~/.ssh/*,则ssh -o BatchMode=yes root@somewhere,如果没有其他问题,我将得到Host key verification failed. 不重要信息,如果您始终处于交互状态,但与遇到相同错误的脚本相关。
罗恩·伯克

毫不奇怪,ssh-keygen -R example.net:7999产量Host example.net:7999 not found in known_hosts
Alex

我删除了known_hosts文件并再次ssh。有效。
巴黎

文件~/.ssh/known_hosts不可读
若昂·皮门特尔·费雷拉

128

如果您在某些远程/脚本化情况下运行,而您对交互式提示添加主机键缺乏交互访问,请按照以下方法解决:

$ ssh -o StrictHostKeyChecking=no user@something.example.com uptime

警告:将“ something.example.com,10.11.12.13”(RSA)永久添加到已知主机列表中。


6
+1,这是一个丑陋的解决方案,但是在某些与动态IP连接设备配合使用的自动监视过程中,这是一个简单且可以接受的解决方案。
Ninsuo,

11
+1例如,对于Jenkins处决,这是一个很好的解决方案。谢谢
Lobo 2015年

5
@Lobo不能同意,我正在将它用于詹金斯,这很酷sh """ssh -o StrictHostKeyChecking=No ec2-user@someIpAddress-e2e sudo service tomcat restart"""
祈祷

救了我。救生员解决方案。
user1735921 17-10-12

10

另外有时在串行控制台上工作时会出现这种情况,然后在详细模式下检查以上命令-v将显示您/dev/tty不存在,但确实存在。

ssh -v user@hostname

在上述情况下只是删除/dev/tty,并创建一个符号链接/dev/ttyS0/dev/tty

rm /dev/tty
ln -s /dev/ttyS0 /dev/tty

或者,将其添加id_rsa.pub到远程位置,这样就不会提示输入密码,并且您可以登录。


6
+1建议使用-v参数;这在调试ssh问题时会很有帮助。
丹尼尔·库尔曼

8

就我而言,这是由udev问题引起的-没有/dev/tty设备节点。对我来说,解决方案是:

sudo mknod -m 666 /dev/tty c 5 0

6

在终端上:

ssh -o StrictHostKeyChecking=no -i YourPublicKey.pem user@example.com uptime

将显示以下消息或类似消息:

Warning: Permanently added 'example.com, XX.XXX.XXX.XX' (ECDSA) to the list of known hosts.
 00:47:37 up 3 min,  0 users,  load average: 0.00, 0.00, 0.00

然后,正常连接到EC2:

ssh -i YourPublickey.pem user@example.com

我知道是command-line line 0: Bad yes/no/ask argument.因为您错误地将“否”而不是“否”用作论点StrictHostKeyChecking
Axel Bregnsbo

3

好吧,这仅仅是因为第二个ubuntu需要通过密钥而不是密码进行连接。

我建议您sudo dpkg-reconfigure openssh-server在PC上使用它,然后它应该可以正常工作。它将重置openssh的配置,并应返回到默认密码身份验证。

第二种可能性是您的PC中已经有另一个ubuntu的密钥,并且它已更改,因此不再被识别。在这种情况下,您必须编辑文件.ssh/authorized_keys以删除标识您的Ubuntu的有问题的行。


3

这是一个旧线程,我只是碰到了这个答案,所以我将添加为解决这个问题所做的事情。

ssh-keygen -f "/home/USER/.ssh/known_hosts" -R HOSTNAME

我只是看了一下它扔给我的错误消息,并说要运行该命令以便将其从主机列表中删除。之后,我执行了以下操作:

ssh-copy-id HOSTNAME

然后,我从那里按照提示进行操作,直到能够进入服务器。


作为此命令,我在ubuntu 12.4中得到了建议。
MaNKuR

2

这意味着您的远程主机密钥已更改(可能是主机密码更改),

您的终端建议以root用户身份执行此命令

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]:4231

您必须从PC /服务器上的主机列表中删除该主机名。复制建议的命令并以root用户身份执行。

$ sudo su                                                            // Login as a root user

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]:4231   // Terminal suggested command execute here
Host [www.website.net]:4231 found: line 16 type ECDSA
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

$ exit                                                               // Exist from root user

$ sudo ssh root@www.website.net -p 4231                              // Try again

希望这行得通。


1

您应该以这种方式更改密钥:例如,从给定的错误中查找哪个主机密钥已更改:在/Users/user-name/.ssh/known_hosts:5中,违反ECDSA密钥的表示,第5个密钥已更改,因此请执行以下操作:

sed -i '5d' ~/.ssh/known_hosts

注意:您必须是root或具有sudo的特权。


不,除非您是为别人做的,否则它不需要root或sudo。您正在编辑主目录中的文件。第二:要使该命令起作用,需要GNU sed。
techraf

也许是正确的,但是我尝试从Mac OSX切换到ubuntu-server,我必须这样做。顺便说一句,谢谢您的评论。
Amir.AG

1

您必须/home/user/.ssh/known_hosts通过在目标计算机上运行此命令,将目标主机的rsa密钥放入源主机

ssh-keyscan -t rsa @targethost

1

当ssh确认您要继续连接时,可能只需要输入“是”即可。

像吼叫

The authenticity of host 'xxx' can't be established.
ECDSA key fingerprint is yyy.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'xxx' (ECDSA) to the list of known hosts.
Enter passphrase for key '/Users/ysy/.ssh/id_rsa':

然后输入您的密码。

请注意“确定要继续连接(是/否)吗? ”。您必须输入是,而不是输入。


1

除了严格禁用主机密钥检查以外,您还可以输入以下内容进行连接:

ssh -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no <username@target_machine_ip_or_domain_name>

0

pico ~/.ssh/known_hosts 并在重新连接后删除所有行,您将获得一个新密钥。


6
这是一个危险的解决方案,因为您将删除所有主机密钥。公认的解决方案ssh-keygen -R hostname更好。
msanford 2014年

0

我的解决方案来自此博客文章:SSH Secure Shell Client的算法协商失败

您需要修改文件,如下所示:

sudo nano /etc/ssh/sshd_config

然后添加以下内容:

# Ciphers
Ciphers aes128-cbc,aes192-cbc,aes256-cbc,blowfish-cbc,arcfour
KexAlgorithms diffie-hellman-group1-sha1

基本上,您尝试了不同的解决方案,直到找到可以解决问题的解决方案。如果上述解决方案不起作用,请尝试此解决方案。如果此方法无法正常运行,请尝试其他方法。


0

只需执行“ sudo vi /var/root/.ssh/known_hosts”并删除该行即可,该行包含您要连接到的主机并再次重新连接的主机的密钥。

我不知道您的具体情况,但是很可能是这个错误伴随着这样的消息出现:

my_mac:~ oivanche$ sudo ssh pi@192.168.0.45
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 ECDSA key sent by the remote host is
SHA256:sx1Z4xyGY9venBP6dIHAoBj0VhDOo7TUVCE2xWXpzQk.
Please contact your system administrator.
Add correct host key in /var/root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /var/root/.ssh/known_hosts:74
ECDSA host key for 192.168.0.45 has changed and you have requested strict checking.
Host key verification failed.

如果您更仔细地阅读日志,您会发现从主机获取的密钥与您已经拥有的密钥发生冲突-在这种情况下,它位于known_hosts文件的第74行(/ var /中违反ECDSA密钥root / .ssh / known_hosts:74)。从known_hosts删除该行,保存更改并重新连接。


-1
chmod 666 /dev/tty 

是另一个tty解决方案-有时,该设备文件具有错误的权限。

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.