ssh
当我尝试进入服务器时,收到了众所周知的警告消息:
$ ssh whateverhost
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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:xxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxx/xxxxxxx.
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user/.ssh/known_hosts:10
ECDSA host key for ipofmyhost has changed and you have requested strict checking.
Host key verification failed.
我知道原因,因为我更改了该服务器的 IP。但如果不是这样,我该如何检查远程主机发送的 ECDSA 密钥的指纹?
我尝试通过以下方式实现此目的:
echo -n ipofthehost | sha256sum
但我没有得到相同的指纹。我还尝试了“主机名,ip”,类似于AWS,但我没有得到任何匹配。
如果我从我的known_hosts文件中删除入口并再次尝试ssh
,它会成功并显示以下内容:
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxx/xxxxxxx.
Are you sure you want to continue connecting (yes/no)?
那么,应用 sha256sum 来获取指纹是为了什么,我该如何检查它?
答案1
公钥指纹不是 IP 地址字符串的简单哈希值。
要检索远程主机公钥,您可以使用ssh-keyscan <IP address>
,然后可以使用常用工具提取其指纹(ssh-keygen -lf <public_key_file>
)。
最后,您可以将文件中的当前指纹known_hosts
与进行比较ssh-keygen -l -F <domain_or_IP_address>
。
答案2
更详细一点:因为警告信息指的是椭圆曲线数字图像分析远程主机发送的密钥,我们收集有关主机的公钥(ECDSA)的信息:
ssh-keyscan -t ecdsa <IP_address_or_hostname> ECDSA_file_to_compare
然后我们就可以找出我们的已知主机文件中的公钥(ECDSA)为:
ssh-keygen -l -F ipofhost
如果我们想比较指纹,我们必须把指纹放在我们的已知主机文件(仅与此主机相关的条目)。我们可以将其称为 ecdsa_file_from_known_hosts,然后对其进行以下比较:
ssh-keygen -lf ecdsa_file_to_compare
ssh-keygen -lf ecdsa_file_from_known_hosts
并检查它们是否显示相同的哈希值。
当然它们不匹配,这就是我收到警告消息的原因(ssh
内部检查此匹配)。如果我们确定 IP 地址发生变化(因此我们不会遭受中间人攻击),我们可以删除我们已知主机文件,下次我们ssh
进入该文件时,一个新的条目将被添加到该文件中。