第一次使用 ssh 连接服务器时,后台会发生什么
当我们第一次连接到服务器时,服务器会提示我们确认我们已连接到正确的系统。
以下示例使用 ssh 命令连接到名为 host03 的远程主机:
# ssh host03 The authenticity of host 'host03 (192.0.2.103)' can’t be established. ECDSA key fingerprint is ... Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'host03,192.0.2.103' (ECDSA) to the list of known hosts.
主机验证是 OpenSSH 的主要功能之一。
该命令会检查以确保我们正在连接到我们认为要连接的主机。
当我们输入 yes 时,客户端会将服务器的公共主机密钥添加到用户的 ~/.ssh/known_hosts 文件中,并在必要时创建 ~/.ssh 目录。
下次连接到远程服务器时,客户端会将此密钥与服务器提供的密钥进行比较。
如果密钥匹配,则不会询问我们是否要继续连接。
如何修复“主机密钥验证失败”错误
方法 1 - 手动删除旧密钥
在源服务器上,旧密钥存储在文件 ~/.ssh/known_hosts 中。
仅当此事件是合法的,并且仅当确切知道 SSH 服务器为何提供不同的密钥时,然后编辑文件 known_hosts 并删除不再有效的密钥条目。
客户端/源服务器中的每个用户在其主目录中都有自己的 known_hosts,只需删除目标服务器特定用户的文件中的条目即可。
例如:
如果 root 想要 ssh 到服务器,只需删除 /root/.ssh/known_hosts 文件中的条目就可以了。
如果 testuser 想要通过 ssh 连接到服务器,则删除文件 /home/testuser/.ssh/known_hosts 中的条目。
- 就我而言,我将从文件 /home/user01/.ssh/known_hosts 中删除目标服务器 192.168.219.149 的密钥(以红色突出显示)。
# vim /home/user01/.ssh/known_hosts 172.104.9.113 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLrY91bQOihgFZQ2Ay9KiBG0rg51/YxJAK7dvAIopRaWzFEEis3fQJiYZNLzLgQtlz6pIe2tj9m/Za33W6WirN8= 192.168.219.148 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCrY/m16MdFt/Ym51Cc7kxZW3R2pcHV1jlOclv6sXix1UhMuPdtoboj+b7+NLlTcjfrUccL+1bkg8EblYucymeU= 192.168.219.149 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCrY/m16MdFt/Ym51Cc7kxZW3R2pcHV1jlOclv6sXix1UhMuPdtoboj+b7+NLlTcjfrUccL+1bkg8EblYucymeU=
方法 2 - 使用 ssh-keygen 命令删除旧密钥
我们也可以使用 ssh-keygen 命令删除旧密钥。
使用该命令的语法如下。
$ ssh-keygen -R [hostname|IP address]
例如,在我们的例子中,我们将使用 IP 地址来删除旧密钥。
$ ssh-keygen -R 192.168.219.149 # Host 192.168.219.149 found: line 3 /home/user01/.ssh/known_hosts updated. Oroirnal contents retained as /home/user01/.ssh/known_hosts.old
注意:如果我们不确切知道为什么 SSH 服务器提供不同的密钥,或者 known_hosts 文件不正确,或者必须有人调查此服务器和网络连接以了解意外更改的原因。
什么原因导致主机密钥验证失败错误
如果有人试图欺骗我们登录他们的机器以便他们可以嗅探 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 the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is dd:cf:50:31:7a:78:93:13:dd:99:67:c2:a2:19:22:13. Please contact your system administrator. Add correct host key in /home/user01/.ssh/known_hosts to get rid of this message. Offending key in /home/lcz/.ssh/known_hosts:7 RSA host key for 192.168.219.149 has changed and you have requested strict checking. Host key verification failed. 《-- 主机密钥验证失败
如果我们收到这样的警告,请停止并确定远程服务器的主机密钥是否有更改的原因(例如 SSH 是否已升级或者服务器本身是否已升级)。
如果没有充分理由更改主机密钥,请在解决问题之前不要尝试连接到该计算机。
这个问题一般出现在服务器互换了IP。
检查确认
如果远程服务器要求确认将新密钥添加到 ~/.ssh/known_host 文件,则确认我们已成功删除旧密钥。
如果我们确认请求,源计算机会将新密钥添加到 ~/.ssh/known_host 文件中。
$ ssh root@192.168.219.149 The authenticity of host '192.168.219.149 (192.168.219.149)' can't be established. ECDSA key fingerprint is SHA256:V+iGp3gwSlnpbtYv4Niq6tcMMSZivSnYWQIaJnUvHb4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.219.149' (ECDSA) to the list of known hosts.