SSH连不上?密钥指纹变更,可能是主机指纹变了!附解决方法

适用场景:内网开发板 / Jetson / 服务器 IP 不变,但ssh user@ip突然失败。
关键词:REMOTE HOST IDENTIFICATION HAS CHANGEDHost key verification failedknown_hosts


一、现象

本机能ping通目标机(例如6.6.7.100),但 SSH 登录失败。过程中可能先后看到两类表现:

表现 A:看起来像密码错了

ssh nvidia@6.6.7.100 nvidia@6.6.7.100's password: Permission denied, please try again.

表现 B:明确报主机身份变更(更关键)

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! ... Offending ED25519 key in /home/<user>/.ssh/known_hosts:5 remove with: ssh-keygen -f "/home/<user>/.ssh/known_hosts" -R "6.6.7.100" Host key for 6.6.7.100 has changed and you have requested strict checking. Host key verification failed.

容易踩坑的一点:下午刚给别的云服务器(如百度云)新生成过~/.ssh/id_ed25519,很容易误以为是「本地私钥被覆盖导致登不上」。
用户登录密钥远端主机密钥是两套东西,别混。


二、结论先说

项目说明
网络ping通则链路基本正常
真正阻塞点本机~/.ssh/known_hosts里缓存的主机指纹,与远端当前 SSH host key 不一致
SSH 行为校验失败时直接中断,不会正常进入后续认证(或表现为各种「登不上」)
和个人密钥关系新生成id_ed25519通常不是本问题的直接原因

一句话:SSH 在确认「这台机器还是不是上次那台」时没过关,所以拒绝连接。


三、原因:两套密钥别搞混

SSH 里至少有两类密钥:

1. 用户密钥(证明「你是谁」)

  • 本地常见文件:~/.ssh/id_ed25519id_ed25519.pub
  • 用途:免密登录、推 Git、连云主机等
  • 你为百度云执行ssh-keygen生成/覆盖的,一般是这一类

2. 主机密钥 / Host Key(证明「这台服务器是谁」)

  • 远端:/etc/ssh/ssh_host_ed25519_key
  • 本机缓存:~/.ssh/known_hosts
  • 第一次连接时,本地会把远端指纹记下来;以后再连必须一致

当远端 host key 变化后,本地仍拿着旧指纹,就会触发:

REMOTE HOST IDENTIFICATION HAS CHANGED! Host key verification failed.

主机密钥为什么会变?

内网板子 / Jetson 上很常见:

  1. 系统重装、刷机、恢复镜像
  2. 重装或重置了openssh-server
  3. 有人重新生成了 SSH host key
  4. 同一个 IP 换成了另一台机器(或另一套系统)

只要指纹变了,严格校验下就会拒绝连接——这是防中间人攻击的正常安全机制,不是随机故障。


四、解决办法

步骤 1:删除该 IP 的旧指纹

按报错提示执行(把 IP 换成你的目标地址):

ssh-keygen-f"$HOME/.ssh/known_hosts"-R"6.6.7.100"

作用:

  • known_hosts删除6.6.7.100对应的旧记录
  • 原内容一般会备份为known_hosts.old

步骤 2:重新连接并确认新指纹

sshnvidia@6.6.7.100

首次会提示类似:

The authenticity of host '6.6.7.100 (6.6.7.100)' can't be established. ED25519 key fingerprint is SHA256:xxxx... Are you sure you want to continue connecting (yes/no/[fingerprint])?

确认是你自己的机器后,输入yes
本机会写入新指纹,之后即可正常登录(密码或密钥认证按你原先配置来)。

步骤 3(可选):若仍认证失败,再查密码/密钥

host key 问题解决后,如果还出现Permission denied,再单独排查:

# 强制只用密码,排除公钥干扰ssh-oPreferredAuthentications=password-oPubkeyAuthentication=no nvidia@6.6.7.100# 看详细认证过程ssh-vvvnvidia@6.6.7.100

常见后续原因:密码输错、账号锁定、远端关闭了密码登录、本地旧用户私钥已被覆盖且远端只认旧公钥等。


五、和「新生成 id_ed25519」的关系

操作影响
ssh-keygen覆盖默认id_ed25519影响用户身份认证;旧私钥丢失则旧免密会失效
known_hosts指纹不匹配影响主机身份校验;连密码提示都可能进不去或直接失败

本次典型链路是:

  1. 远端 host key 已变更(刷机 / 重装 / 换机等)
  2. 本地仍保留旧指纹
  3. SSH 报Host key verification failed
  4. 执行ssh-keygen ... -R <ip>清掉旧记录并重新信任新指纹后恢复

给云服务器配密钥时,建议不要覆盖默认文件名,单独指定:

ssh-keygen-ted25519-f~/.ssh/id_ed25519_baidu-C"baidu"

并在~/.ssh/config里按 Host 分开配置IdentityFile,避免和内网开发板互相干扰。


六、排查清单(可收藏)

  1. ping是否通?不通先查网络 / IP / 网线 / 交换机。
  2. 报错是否含REMOTE HOST IDENTIFICATION HAS CHANGED/Host key verification failed
    • 是 →ssh-keygen -R <ip>,再重连确认指纹。
  3. host key 已更新后仍失败?
    • ssh -vvv看卡在公钥还是密码。
    • 必要时强制密码:PubkeyAuthentication=no
  4. 近期是否覆盖过id_ed25519
    • 若远端只认旧公钥,需重新写入authorized_keys或改用密码登录后补钥。

七、小结

  • Host key verification failed不是密码错,是本机记住的服务器指纹过期了。
  • 解决核心命令:ssh-keygen -f ~/.ssh/known_hosts -R "<ip>",然后重新ssh并接受新指纹。
  • 用户密钥(id_ed25519)≠ 主机密钥(known_hosts;换云主机密钥时尽量用独立文件名,避免误伤日常开发连接。

记录环境示例:Ubuntu 开发机 →nvidia@6.6.7.100(Jetson / Ubuntu 22.04 tegra)。排查思路同样适用于其他 Linux SSH 场景。