SSH连不上?密钥指纹变更,可能是主机指纹变了!附解决方法
适用场景:内网开发板 / Jetson / 服务器 IP 不变,但
ssh user@ip突然失败。
关键词:REMOTE HOST IDENTIFICATION HAS CHANGED、Host key verification failed、known_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_ed25519、id_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 上很常见:
- 系统重装、刷机、恢复镜像
- 重装或重置了
openssh-server - 有人重新生成了 SSH host key
- 同一个 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指纹不匹配 | 影响主机身份校验;连密码提示都可能进不去或直接失败 |
本次典型链路是:
- 远端 host key 已变更(刷机 / 重装 / 换机等)
- 本地仍保留旧指纹
- SSH 报
Host key verification failed - 执行
ssh-keygen ... -R <ip>清掉旧记录并重新信任新指纹后恢复
给云服务器配密钥时,建议不要覆盖默认文件名,单独指定:
ssh-keygen-ted25519-f~/.ssh/id_ed25519_baidu-C"baidu"并在~/.ssh/config里按 Host 分开配置IdentityFile,避免和内网开发板互相干扰。
六、排查清单(可收藏)
ping是否通?不通先查网络 / IP / 网线 / 交换机。- 报错是否含
REMOTE HOST IDENTIFICATION HAS CHANGED/Host key verification failed?- 是 →
ssh-keygen -R <ip>,再重连确认指纹。
- 是 →
- host key 已更新后仍失败?
ssh -vvv看卡在公钥还是密码。- 必要时强制密码:
PubkeyAuthentication=no。
- 近期是否覆盖过
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 场景。
