@snownstone

解决:authenticity of host 'github.com(ip)' can't be established

Published on

欢呼!!!

无解时以头撞墙的冲动有多强烈(亚当·斯密写《国富论》的时候真的会撞),解决后原地就能蹦多高。


讨人厌的问题

git push 出现如下警告:

git push 报错

问题出现的莫名其妙。

本地的 git 仓库通过 SSH 与 GitHub 上的远程仓库建立连接,这个过程是加密的(SSH 的属性和功能),所以涉及到公钥私钥 key pair 以及彼此身份验证的概念。在看了一堆网上的各种指点并做了各种尝试后,始终有两个非常具体的问题没有解决且不能理解:

  • 测试连接 GitHub 时 (ssh -T git@github.com返回的 key fingerprint 与 GitHub 公布的不同

    公钥指纹
  • 在上一步冒险同意继续与 host 建立连接,又会被询问如下问题,输过各种仍不清楚到底 git@github.com 要的是什么密码

    git@github.com密码

问题所在

SSH 的 client(如本地 git 仓库)与 host(如 github.com) 在建立连接时身份验证失败的问题很常见,通常在 known_hosts 中删掉已失效的密钥更新添加新的密钥重新建立连接就能解决。报错警告看起来很严重,提醒有黑客(man-in-the-middle) 挡在 client 和 host 之间的可能性,虽然概率非常非常低,也还是要小心!如上图 2 所示,我的就不符合,所以不该选择信任并继续下面的操作,只要拒绝信任,黑客的攻击就并没有真的成功。这里 有说,正是因为 99.99999% 的时候错误的原因都不是黑客攻击造成的,所以用户的掉以轻心(不假思索未经核对选择信任)又反过来恰恰是黑客真正攻击时利用的漏洞。

我是绕了很久之后才终于在两个网上回答的提示下意识到我的问题可能出在代理如 VPN 或路由器的设置等本地什么障碍挡住了和 github 网站的连接。从截图 2 其实就已能看出 github.com 的 IP 地址解析有问题,后面括号内是 ::1,这是本地的 IPV6 地址,对应 IPV4 的 127.0.0.1,但我之前哪知道这些呀,只是觉得奇怪。

下面显示的就是 ping github.com 结果来自本地。

ping github1
ping github2

解决办法

这里查询 github.com 的有效 IP 地址,然后添加到 /etc/hosts 文档中。

github hosts

之后使用 ssh-keygen 生成新的密钥,把公钥添加到 github 账户中,再次验证连接 github(ssh -T git@github.com), 返回的公钥指纹就对啦!(具体操作可以看这个)

参考并感谢

What Is SSH: Understanding Encryption, Ports and Connection(关于 SSH 和加密连接)

Being prompted for the password for "git@github.com" when SSH-ing from WSL2 (这篇问答是理解问题的转折点)

What can cause a changed ssh fingerprint?

ssh authentication succeeds to git (github.com) but connection closes(这篇把问题引向了路由器的设置,非黑客非恶意,但的确存在 man-in-the-middle)

关于github ssh验证出错问题?(这篇是解决问题的转折点)

访问github.com被解析到127.0.0.1问题解决(具体解决办法在此)

github访问不了(hosts 在哪)