使用 ssh 连接相同 ip 不同主机时的 fingerprint 冲突问题

最近将家里的路由器刷了 openwrt,当使用 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
SHA256:............................................
Please contact your system administrator.
Add correct host key in /home/example/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/example/.ssh/known_hosts:1
RSA host key for 192.168.1.1 has changed and you have requested strict checking.
Host key verification failed.

这是由于之前在出租的房子里路由器同样是 openwrt,而且已经登录过并保存了该路由器的 RSA key fingerprint,导致与现在连接的路由器的 RSA key fingerprint 不匹配而冲突了。

最简单的解决方式是将之前的 fingerprint 从 ~/.ssh/known_hosts 里删除,但这样如果连接原来的路由器又会出现冲突。

这里可以在使用 ssh 连接时使用 -o 'UserKnownHostsFile /dev/null' 临时解决。

另外可以通过分别为不同的 host(这里是路由器)设置 HostKeyAlias 参数来区分开来,例如:

在连接出租屋里的路由器时,可以使用 ssh -o 'HostKeyAlias host1' [email protected] 连接,

在连接家里的路由器时,使用 ssh -o 'HostKeyAlias host2' [email protected] 连接。

但这样每次连接都需要添加这么长的参数,显得很麻烦,这时可以通过将参数添加到 ~/.ssh/config 里解决:

Host host1
    Hostname 192.168.1.1
    HostKeyAlias host1
    Port 22
    User root

Host host2
    Hostname 192.168.1.1
    HostKeyAlias host2
    Port 22
    User root

这样,就可以分别使用 ssh host1ssh host2 来连接了。