在家里的电脑上想克隆公司内网的Gitref="/tag/244/" style="color:#479099;font-weight:bold;">仓库,结果命令刚敲下去,终端蹦出一行红字:Host key verification failed。这种情况其实挺常见的,尤其在使用内网穿透搭建私有Git服务时更容易遇到。
这个错误的本质是SSH在连接远程主机时,发现目标主机的公钥指纹和本地记录的不一致,出于安全考虑直接中断了连接。可能是因为你之前连过同名IP但不同设备,或者服务器重装过系统导致密钥变了,也可能是通过内网穿透工具映射的端口第一次访问。
快速定位问题
比如你用的是 frpc 做内网穿透,把家里NAS上的Git服务暴露到公网,域名是 git.zhiyonglife.com,端口映射到了 2222。当你执行:
git clone ssh://git@zhiyonglife.com:2222/home/git/project.git
就可能触发这个警告。SSH怀疑你正在连接一个伪装成原服务器的中间人,所以拒绝继续。
手动清除旧密钥记录
最直接的办法是删掉本地对这个主机的旧记录。SSH会把已知主机的密钥存放在 ~/.ssh/known_hosts 文件里。可以手动编辑这个文件,找到对应IP或域名的那一行删掉。
更方便的是用命令行工具:
ssh-keygen -R zhiyonglife.com
# 或者指定端口
ssh-keygen -R [zhiyonglife.com]:2222
这条命令会自动从 known_hosts 中移除匹配的条目,之后再克隆仓库就会重新提示你确认主机密钥。
跳过主机验证(仅限可信环境)
如果你是在自己完全掌控的内网或测试环境中,不想每次都被打断,可以在SSH连接时临时关闭严格校验:
git clone ssh://git@zhiyonglife.com:2222/home/git/project.git
改成:
git clone ssh://git@zhiyonglife.com:2222/home/git/project.git -c core.sshCommand="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
这种方式适合自动化脚本,但别在公共网络用,毕竟等于放弃了防中间人攻击的能力。
长期方案:固定主机密钥
更好的做法是在服务器端保留原始的 ssh_host_rsa_key 和 ssh_host_rsa_key.pub,哪怕换机器也不要重新生成。这样通过内网穿透访问时,客户端看到的主机指纹始终一致,就不会反复报错。
比如你在树莓派上搭的Git服务,重刷系统后记得恢复之前的SSH主机密钥文件,位置通常在 /etc/ssh/ 目录下。重启sshd服务后,老设备连上来就不会再弹出验证失败了。
遇到这个问题不用慌,它不是网络不通,也不是密码错了,只是SSH太“认真”了。理解它的逻辑后,处理起来其实很简单。