SSH 防止中间人攻击的机制

阅读 17

最近树莓派5又火了起来,价格暴涨,价格涨了一倍不止。一方面是因为内存价格暴涨,另一方面是openclaw的火热。

所以,今天,我又重新拿起了树莓派5,想给它整点新的使命!通过SSH登录树莓派系统:

ssh pi@192.168.3.84

却意外地抛出了一个提示:

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 ED25519 key sent by the remote host is
SHA256:zfaO5tUKsQnCCQZh4iiSqAcBiufLYenDSz9zFe+TeJs.
Please contact your system administrator.
Add correct host key in /Users/moddx/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/moddx/.ssh/known_hosts:55
Host key for 192.168.3.84 has changed and you have requested strict checking.
Host key verification failed. 

中间人攻击?不可能吧,我是局域网用的。

我之前在树莓派安装了两个系统。一个是安装到micro SD卡上的桌面版,另外一个是安装到NVME硬盘的Lite版(无桌面,纯命令行)。这两个版本虽然属于不同的系统,但IP地址都是192.168.3.84。由于之前使用SSH连接过Lite版,现在,切换到micro SD卡上的桌面版后,就提示了这个警告。

原因提示非常明显:Host key verification failed这个过程是客户端单向验证服务端的身份,防止连上伪造的服务器。

这是出于安全的考虑!那整个过程是怎样进行的呢?

首先,树莓派在安装 SSH 服务(OpenSSH)时,会自动生成几对“主机密钥”(Host Key),一般包括 RSA、ECDSA、ED25519 等。这些密钥对存放在树莓派的 /etc/ssh/ 目录下:

ssh_host_ed25519_key      # 私钥,严格保密
ssh_host_ed25519_key.pub  # 公钥,连接时会发给客户端

上面那串SHA256:zfaO5...TeJs,就是就是树莓派 ED25519 公钥的指纹(摘要),用来唯一标识这台树莓派机器。

我的电脑之前连过 192.168.3.84,那时树莓派服务器提供的是 ECDSA 密钥。现在同一 IP 提供的却是 ED25519,算法和指纹都变了,说明对面的机器换过(重装系统或换了设备)。 SSH 为了安全,直接报警并中断连接。

Host key verification 的整个过程

第一次连接时:

  • 客户端发起连接:ssh pi@192.168.3.84;
  • 服务端出示公钥:树莓派把自己的 ssh_host_ed25519_key.pub 发给到我的电脑;
  • 客户端询问用户:终端显示指纹,问客户端是否信任:
The authenticity of host '192.168.3.84' can't be established.
ED25519 key fingerprint is SHA256:xxxx.
Are you sure you want to continue connecting (yes/no)?
  • 输入 yes:该公钥被存入客户端电脑的 ~/.ssh/known_hosts 文件中
  • 后续加密通信:基于这个公钥进行密钥交换,建立加密通道

后续连接(有历史记录):

  • 服务端出示公钥
  • 客户端查 known_hosts:对比当前收到的公钥和之前保存的是否一致
  • 一致 → 静默通过,直接输密码

  • 不一致 → 报警,中断连接(就是上面遇到的情况)

解决方法

知道了原因,解决方法也就很清晰了。在客户端电脑上执行:

ssh-keygen -R 192.168.3.84

该命令会打开电脑上的 ~/.ssh/known_hosts 文件,找到其中所有跟 192.168.3.84 相关的行,然后删除它们。执行完以后,树莓派的 IP 对客户端电脑来说就变成了“陌生人”,SSH 连接时会提示重新确认它的指纹。

最后编辑于: 2026-05-07

评论(0条)

(必填)
复制成功