为什么通过 SSH 连接到 GitHub 时会抛出错误“警告:远程主机标识已更改”?

Dhe*_*.S. 641 git ssh github ssh-keys

就在不久前,我在推送到 GitHub 时开始收到此警告。

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

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.
Run Code Online (Sandbox Code Playgroud)

这是正常现象吗?我该如何解决?

Dhe*_*.S. 950

发生这种情况是因为 2023 年 3 月 24 日,GitHub更新了用于保护 GitHub.com 的 Git 操作的 RSA SSH 主机密钥,因为私钥在公共 GitHub 存储库中短暂公开。如果您在该日期之前记住了 SSH 客户端中的 GitHub\xe2\x80\x99s 上一个密钥指纹,您将收到该消息。

\n

根据链接的博客文章,解决方案是通过运行以下命令删除旧密钥:

\n
$ ssh-keygen -R github.com\n
Run Code Online (Sandbox Code Playgroud)\n

现在,下一个git连接(拉取、推送或克隆)应该询问您是否信任新的 SSH 密钥。在输入之前yes,请使用以下列表确保显示的新密钥有效:

\n

https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints

\n

请参阅博客文章了解解决该问题的其他方法。

\n

  • @AlainD:这是预料之中的,因为这个命令基本上只是说“忘记旧的公钥”,而下一次将信任新的公钥。如果您想保持正确,最好提前保存新的、已知正确的信息(博客文章告诉您如何操作)。 (9认同)
  • 除了隐藏在“~/.ssh/known_hosts”中的“github.com”密钥之外,我还有一个“ssh.github.com”的旧 RSA 密钥。如果您看到它,请将其删除;按照@AlainD 的描述,输入“yes”后,它将更新。 (5认同)
  • 在 Windows 上使用 Git Bash,我发现上述命令有效,但在 `git push` 上我收到一条消息“无法建立 github.com 的真实性”。当被问及是否要继续时,我输入“是”,现在一切又恢复正常了。 (2认同)

Sat*_*ors 54

根据 GitHub 的博客文章,他们的 SSH 密钥已泄露,因此他们重新生成了密钥。

您需要通过运行以下命令来删除存储的密钥:

ssh-keygen -R github.com
Run Code Online (Sandbox Code Playgroud)

应该输出如下内容:

# Host github.com found: line 1
.ssh/known_hosts updated.
Run Code Online (Sandbox Code Playgroud)

如果您想主动行动,您可以按照命令来获取他们的新密钥。这可能不适用于 Windows,并且没有它也不需要。下次您尝试访问 GitHub 时,系统将提示您保存新密钥。

curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

完成后,您可以重新运行git您尝试的命令。


bk2*_*204 48

是的,GitHub 更新了他们的 RSA 主机密钥,如其博客文章中所述。您可以按照那里的说明更新您的密钥。

然而,有些人发现 OpenSSH 还通过CheckHostIP选项保存了 IP 地址的主机密钥。在 OpenSSH 8.5 之前默认启用此功能,但往往没有什么帮助,因为它使轮换变得困难,因此在该版本中被禁用。话虽如此,它可以像这样解决(在 Linux 和 Git Bash 上):

$ sed -i -e '/AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31\/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi\/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==/d' ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

在 macOS 上也是如此:

$ sed -i '' -e '/AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31\/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi\/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==/d' ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

无论在哪里找到密钥,无论是主机名还是 IP 地址,都会将其删除。由于 GitHub 使用多个 IP 地址,因此实际上不可能枚举所有 IP 地址并使用 删除它们ssh-keygen,因此手动删除密钥本身是最佳选择。

然后,您可以按照博客文章中的说明自动更新密钥:

$ curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | \
  sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)


Dis*_*lia 37

来自 GitHub 的我们更新了 RSA SSH 主机密钥,您可以做什么

\n
\n

世界标准时间 [2023] 3 月 24 日大约 05:00,出于谨慎考虑,我们更换了用于保护 GitHub.com 的 Git 操作的 RSA SSH 主机密钥。我们这样做是为了保护我们的用户免受对手冒充 GitHub 或通过 SSH 窃听其 Git 操作的任何机会。此密钥不会授予对 GitHub\xe2\x80\x99s 基础架构或客户数据的访问权限。此更改仅影响使用 RSA 通过 SSH 进行的 Git 操作。GitHub.com 的 Web 流量和 HTTPS Git 操作不受影响。

\n
\n

解决方案:从文件.ssh/known_hosts 中删除 GitHub 的旧 RSA SSH 密钥\n并更新新密钥。

\n


Gab*_*les 16

Ubuntu 20.04上,使用GitHub 上的Ed25519密钥,即使在运行之后ssh-keygen -R github.com,根据主要答案,每次运行时我都会看到这些通知git push

$ git push
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '140.82.112.4'
Offending key for IP in /home/gabriel/.ssh/known_hosts:14
Matching host key in /home/gabriel/.ssh/known_hosts:15
Are you sure you want to continue connecting (yes/no)? yes
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '140.82.112.4'
Offending key for IP in /home/gabriel/.ssh/known_hosts:14
Matching host key in /home/gabriel/.ssh/known_hosts:15
Are you sure you want to continue connecting (yes/no)? yes
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '140.82.112.4'
Offending key for IP in /home/gabriel/.ssh/known_hosts:14
Matching host key in /home/gabriel/.ssh/known_hosts:15
Are you sure you want to continue connecting (yes/no)? yes
Run Code Online (Sandbox Code Playgroud)

所以,我最终~/.ssh/known_hosts通过重命名它来删除我的文件,如下所示:

(尝试@bk2204的答案,而不是运行mv下面的cmd。谢谢,@Guntram Blohm)。

mv ~/.ssh/known_hosts ~/.ssh/known_hosts.bak
Run Code Online (Sandbox Code Playgroud)

...现在git push终于又可以正常工作了!我不在乎每当我再次使用 SSH 连接到特定服务器时都必须重新验证所有 SSH 目标,因此有效地删除该~/.ssh/known_hosts文件就可以了。除了推送到 GitHub 和 GitLab 之外,我几乎不使用 SSH。

注意:之后我第一次运行时git push必须输入yes,如下所示:

$ git push
The authenticity of host 'github.com (140.82.112.4)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com,140.82.112.4' (ECDSA) to the list of known hosts.
Everything up-to-date
Run Code Online (Sandbox Code Playgroud)

不过,在输入 之前yes,我首先在 GitHub 网站上验证了SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM来自 GitHub 的指纹是否正确。GitHub 在这里有每种密钥类型的指纹:https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints

这些是 GitHub 的公钥指纹:

  • SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s(RSA)
  • SHA256:br9IjFspm1vxR3iA35FWE+4VTyz1hYVLIE2t1/CeyWQ(DSA - 已弃用)
  • SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM(电子数字签名分析系统)
  • SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU(Ed25519)

  • HTTPS 和 SSH 使用不同的私钥。HTTPS 私钥没有泄露,只是 SSH 私钥泄露。 (9认同)
  • 如果您不使用 ssh 进行其他任何操作,这可能是一种解决方法,但如果您连接到其他服务器,这意味着对其密钥的任何更改都将不会被注意到。(显然你还有其他一些密钥,因为密钥位于“known_hosts”的第 14 行和第 15 行。最好像 @bk2204 的答案一样删除密钥,或者记下行号(在你的情况下为 14)并手动删除第 14 行。 (4认同)
  • Gabriel,JBYoshi 正在回复 Davislor,Davislor 暗示在使用您要检查的密钥检查指纹时存在循环。实际上,您正在使用通过 HTTPS 验证的指纹来验证 SSH 密钥,而该指纹并未受到泄漏的影响。所以没有圆性。都好。 (3认同)
  • @JBYoshi,我看到你的评论有几个点赞,所以你能解释一下这意味着什么以及它是如何相关的吗?我不明白你在告诉我什么,或者你是否表明我应该做一些不同的事情,但想了解更多。 (2认同)
  • 是的,他们回答了我的问题。存在一些漏洞,有人使用从攻击者控制的站点获得的密钥或校验和进行“验证”。 (2认同)
  • @LucaCiti 我的意思是我之前的评论是对 Davislor 的回复。很抱歉造成混乱 - 我是 StackOverflow 的新手,所以我不知道需要这样做。 (2认同)
  • 现在一切都清楚了。顺便说一句,这是一个有趣的讨论,并且总是值得提出不验证攻击者可能控制的东西的问题! (2认同)

Jef*_*ard 15

GitHub博客简单地建议:

\n
ssh-keygen -R github.com\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,这并不那么容易,我不断收到如下错误,显示 GitHub 服务器位于我的由 IP 地址存储的known_hosts文件中。

\n
Warning: the ECDSA host key for \'github.com\' differs from the key for the IP address \'192.30.255.113\'\nOffending key for IP in /.ssh/known_hosts:19\nMatching host key in /.ssh/known_hosts:178\nAre you sure you want to continue connecting (yes/no)? yes\n
Run Code Online (Sandbox Code Playgroud)\n

您必须搜索与 github.com 服务关联的 1000 个 IP 地址才能清理它们...

\n

我设计了一个 Ruby 脚本来搜索通过 GitHub元 API发布的 GitHub IP 地址。它是有限的\xe2\x80\x94它跳过巨大的“操作”IP地址范围,并且仅适用于IPv4,但希望它可以帮助其他人不必按yes很多次。

\n

https://gist.github.com/jcward/5a64c17a6b61de0f7a4d85d004e7679e

\n

出于存档目的,将其复制于此:

\n
ssh-keygen -R github.com\n
Run Code Online (Sandbox Code Playgroud)\n