Skip to content

GitHub SSH 主机密钥变更警告

问题陈述

当通过 SSH 连接至 GitHub 时,用户可能遇到以下安全警告:

bash
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.

此问题于 2023 年 3 月 24 日 集中出现,原因是 GitHub 官方主动更新了其 RSA SSH 主机密钥以应对潜在的密钥泄露风险。虽然警告属于安全机制的正常反应,但需及时处理以恢复 Git 操作功能。

解决方案

基础解决步骤(推荐)

适用系统

Linux、macOS、Windows (Git Bash/WSL)

  1. 清除旧密钥记录

    bash
    ssh-keygen -R github.com

    成功执行后终端将显示:

    bash
    # Host github.com found: line 1
    .ssh/known_hosts updated.
  2. 首次重连验证: 随后执行任意 Git 操作(如 git push),系统会提示验证新指纹:

    bash
    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])?

    务必核对指纹是否匹配 GitHub 官方公布的以下值之一:

    • RSA: SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
    • ECDSA: SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM
    • Ed25519: SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU
  3. 输入确认: 验证无误后输入 yes 即可完成密钥更新。

进阶场景处理

特殊情况

若基础步骤后仍出现 IP 地址警告,可能因历史记录中有 GitHub 的 IP 密钥残留

方案一:删除整个 known_hosts 文件
(适用于密钥记录较少的环境)

bash
mv ~/.ssh/known_hosts ~/.ssh/known_hosts.bak
touch ~/.ssh/known_hosts

方案二:多平台手动清理
macOS

  1. 打开文件:open /Users/{用户名}/.ssh/known_hosts
  2. 删除含 github.combitbucket.org 的行
  3. 保存并重试 SSH 连接

Windows PowerShell

powershell
Remove-Item "C:\Users\<用户名>\.ssh\known_hosts"

方案三:脚本清理残余 IP 密钥
(通过 GitHub API 获取 IP 并批量清理)

rb
#!/usr/bin/env ruby
require 'json'
meta = JSON.parse `curl -s https://api.github.com/meta`
# ...完整脚本见 GitHub Gist:
# https://gist.github.com/jcward/5a64c17a6b61de0f7a4d85d004e7679e

密钥主动更新方案

预防性维护

在解决警告后,可通过此命令预加载 GitHub 最新密钥:

bash
curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts

原理解释

密钥变更背景

2023 年 3 月 24 日,GitHub 主动更替 RSA SSH 主机密钥以应对私钥意外暴露风险。此次变更 仅影响 SSH 协议的 RSA 密钥,HTTPS 和网页访问不受波及。

安全机制必要性

SSH 客户端通过 ~/.ssh/known_hosts 存储远程服务器的公钥指纹。当服务器密钥变更时:

  1. 客户端检测到指纹不匹配
  2. 触发警告防止中间人攻击
  3. 需人工确认以更新信任记录

安全提示

切勿跳过指纹验证!恶意攻击者可能伪造此警告诱导用户接受虚假密钥。始终通过官方指纹列表核对真实性。

跨平台要点总结

系统推荐方案备选方案
Linuxssh-keygen -R github.com脚本清理 / 重建 known_hosts
macOS同上 + 手动验证编辑 known_hosts 文件
WindowsGit Bash 执行基础步骤PowerShell 删除 known_hosts