GitHub 突然拒绝了我的 SSH 密钥(解决办法竟是 .pub 文件?!)
摘要
GitHub 的 SSH 服务器现在拒绝接受直接签名的公钥请求,要求私钥附带 .pub 文件;解决办法是使用 ssh-keygen 从私钥生成 .pub 文件。
<p><a href="https://lobste.rs/s/twqtlo/github_suddenly_rejected_my_ssh_key_fix">评论</a></p>
查看缓存全文
缓存时间: 2026/07/21 10:38
# GitHub 突然拒绝了我的 SSH 密钥(解决方案居然是一个 .pub 文件?!)
来源:https://thorsell.io/2026/07/21/github-ssh-keys.html
阅读时间:1 分钟
今天,`git pull` 在我的主力笔记本电脑上突然罢工了。`Permission denied (publickey)`,毫无征兆。我什么都没改,密钥仍然在 GitHub 上注册着,用另一台笔记本电脑(使用另一个密钥)拉取同一个仓库却一切正常。
## 排查过程
省去完整的故障排除记录1(https://thorsell.io/2026/07/21/github-ssh-keys.html#fn:session)。密钥在数学上是没问题的(`openssl rsa -check` 显示 `RSA key ok`),签名算法用的是现代的 `rsa-sha2-512`,我的 `~/.ssh/config` 也很干净,GitHub 的状态页面全部绿灯。但依然报错:`Permission denied`。
解决办法小得让人尴尬。自从我重装笔记本电脑后,我的 `~/.ssh/github_rsa` 就一直缺少对应的 `.pub` 文件。生成一个后,认证就恢复正常了:
`` $> ssh-keygen -y -f ~/.ssh/github_rsa > ~/.ssh/github_rsa.pub ``
连我自己都不信,所以我测试了六次带上 `.pub` 文件,六次不带。十二次全中:没有 `.pub` – 被拒绝,有 `.pub` – 通过。
## 这为什么会影响认证?
因为 `.pub` 文件会改变 OpenSSH 使用的*认证流程*。当存在 `.pub` 文件时,客户端会先*探测*(即先提交公钥,等待服务器确认),然后才进行签名。如果只有私钥,OpenSSH 会跳过探测,直接发送一个完整签名的认证请求。
这两种流程在 RFC 4252 中都是完全合法的,标准的 `sshd` 两种都接受。但显然,今天的 GitHub 并不接受。
## GitHub 那边是不是有什么变化?
我猜是的。我的调试日志中服务器标识显示为 `6a2c000`,而 GitHub 的 SSH 前端历史上一直以 `babeld-` 自称。这看起来像是新的服务器软件——这种软件会拒绝直接签名的公钥请求。这就完美解释了为什么早上还好好的,一小时后在同一台没做任何改变的机器上就不好使了。
还有其他人遇到这个问题吗?你知道 `6a2c000` 是什么吗?欢迎告诉我——同时记住:请确保你的私钥身边有 `.pub` 文件陪伴。
相似文章
@dreamsofcode_io: 现在正是考虑将你的 SSH 密钥放在硬件安全密钥(如 Yubikey)上的好时机。
一条推文建议将 SSH 密钥使用硬件安全密钥(如 Yubikey)进行保护,并提及 npm、PyPI 和 Crates.io 上正在活跃的跨生态系统供应链攻击(TrapDoor),该攻击涉及恶意包和窃取加密货币的恶意软件。
GitHub:内部仓库遭到未授权访问
GitHub 发生安全事件,导致内部仓库遭未授权访问。
GitHub API请求相关认证问题
GitHub遇到认证问题,影响约15%的API流量,导致错误的401响应,并影响Issues和API请求。该事件已解决。
GitLost:我们诱骗GitHub的AI代理泄露私有仓库
Noma Labs发现GitHub的Agentic Workflows中存在一个严重的提示注入漏洞,允许未经身份验证的攻击者通过在同一组织的公共仓库中发布精心构造的GitHub Issue,从私有仓库中窃取数据。
GitHub 正在调查对其内部仓库的未授权访问
GitHub 正在调查对其内部仓库的未授权访问,目前没有证据表明客户数据受到影响。