影评周公子 2026-04-11 06:50 采纳率: 99.1%
浏览 1
已采纳

GitHub SSH密钥配置后仍提示“Permission denied (publickey)”如何解决?

**问题描述(198词):** GitHub SSH密钥配置后仍报错 `Permission denied (publickey)`,是开发者高频踩坑场景。常见原因包括:① SSH密钥未正确添加到ssh-agent(如未执行 `eval "$(ssh-agent -s)"` + `ssh-add ~/.ssh/id_rsa`);② GitHub账户未绑定公钥(`cat ~/.ssh/id_rsa.pub` 后未粘贴至 Settings → SSH and GPG keys);③ Git远程URL仍为HTTPS格式(应改用 `git@github.com:user/repo.git`);④ 私钥权限过宽(需 `chmod 600 ~/.ssh/id_rsa`);⑤ 多密钥环境未配置 `~/.ssh/config` 指定Host与IdentityFile;⑥ SSH客户端未启用公钥认证(检查 `ssh -T -v git@github.com` 输出中是否出现 `Offering public key` 及后续拒绝日志)。特别注意:GitHub默认不再支持RSA-SHA1签名(2022年起),若使用老旧RSA密钥且未启用`PubkeyAcceptedAlgorithms +ssh-rsa`(OpenSSH 8.8+),也会静默失败。建议优先生成ED25519密钥(`ssh-keygen -t ed25519 -C "your_email"`)并更新配置。排查务必从`ssh -T -v git@github.com`的详细日志入手,定位具体拒绝环节。
  • 写回答

1条回答 默认 最新

  • 白街山人 2026-04-11 06:51
    关注
    ```html

    一、现象层:典型报错与高频复现场景

    开发者执行 git pushssh -T git@github.com 时,终端持续输出 Permission denied (publickey) —— 这是 GitHub SSH 认证失败最表层、最直观的信号。该错误在 CI/CD 集成、多账户协作、企业 DevOps 流水线中高频复现,尤其在 macOS/Linux 终端环境与 Windows WSL2 下尤为顽固。值得注意的是,该错误不区分密钥类型或平台版本,但会因 OpenSSH 版本(≥8.8)、GitHub 服务端策略(2022 年起弃用 RSA-SHA1)及客户端配置粒度产生静默差异。

    二、协议层:SSH 认证握手关键路径

    graph LR A[ssh -T -v git@github.com] --> B{TCP 连接建立} B --> C[SSH 协议版本协商] C --> D[服务端发送支持的公钥算法列表] D --> E[客户端选择算法并 Offering public key] E --> F{GitHub 服务端校验} F -->|公钥匹配且签名有效| G[Authentication succeeded] F -->|算法不支持/签名验证失败/未注册公钥| H[Permission denied publickey]

    关键断点在于第 E→F 步:若日志中缺失 Offering public key,说明客户端未加载密钥;若出现该行但紧随 Server refused our key,则指向服务端侧拒绝(如未绑定、算法禁用、权限错误)。

    三、配置层:六大核心检查项(结构化清单)

    序号问题域诊断命令修复操作
    ssh-agent 未激活或密钥未载入ssh-add -l(应显示密钥)eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa
    GitHub 账户未绑定公钥cat ~/.ssh/id_rsa.pub | pbcopy(macOS)粘贴至 Settings → SSH and GPG keys → New SSH key
    Git remote URL 仍为 HTTPSgit config --get remote.origin.urlgit remote set-url origin git@github.com:user/repo.git
    私钥权限过宽(安全强制)ls -l ~/.ssh/id_rsa(应为 -rw-------)chmod 600 ~/.ssh/id_rsa
    多密钥环境 Host 匹配失效ssh -F ~/.ssh/config -T git@github.com~/.ssh/config 中添加:
    Host github.com
      HostName github.com
      User git
      IdentityFile ~/.ssh/id_ed25519
    OpenSSH 8.8+ 算法兼容性ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa -T git@github.com生成新密钥:ssh-keygen -t ed25519 -C "your_email@example.com";更新 config 与 GitHub 绑定

    四、根因层:RSA-SHA1 弃用机制深度解析

    自 2022 年 3 月起,GitHub 服务端默认关闭 ssh-rsa(RSA-SHA1)签名验证。OpenSSH 8.8+ 客户端亦同步移除该算法默认启用。这意味着:即使你的 id_rsa.pub 已正确上传、ssh-add 成功、URL 为 SSH 格式,只要密钥是传统 RSA 类型且未显式启用兼容模式,ssh -T -v 日志中将出现 no mutual signature algorithm 或直接跳过公钥尝试。此非配置错误,而是密码学演进导致的协议级断裂。ED25519 密钥(ssh-keygen -t ed25519)因其抗量子特性、更短密钥长度与原生 SHA-2 签名,成为当前唯一零配置推荐方案。

    五、验证层:分阶段调试黄金流程

    1. 运行 ssh -T -v git@github.com,捕获完整日志(重点关注 debug1: Offering public key 及后续 3 行)
    2. 确认是否进入认证阶段:若卡在 debug1: Next authentication method: publickey 后无响应,检查 ssh-agent 与权限
    3. 若出现 debug1: Authentications that can continue: publickey 但最终失败,检查 GitHub 公钥绑定状态与算法兼容性
    4. 使用 ssh -o LogLevel=DEBUG3 -o PubkeyAcceptedAlgorithms=+ssh-rsa git@github.com 验证 RSA 兼容性
    5. 对 ED25519 密钥,确保 ~/.ssh/config 中 Host 条目明确指定 IdentityFile,避免多密钥冲突
    6. 在 CI 环境(如 GitHub Actions)中,需通过 ssh-add <(echo "$SSH_PRIVATE_KEY") 显式注入密钥
    7. 企业防火墙或代理可能拦截 SSH 端口(22),可临时测试 ssh -p 443 git@ssh.github.com(需更新 config 的 HostName 和 Port)
    8. 检查 /etc/ssh/ssh_config 全局配置是否覆盖了用户级设置(如禁用 PubkeyAuthentication
    9. macOS Keychain 可能自动接管密钥管理,需执行 ssh-add --apple-use-keychain ~/.ssh/id_ed25519
    10. 最后验证:执行 git ls-remote git@github.com:user/repo.git HEAD,成功返回 commit hash 即标志全链路打通
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 4月12日
  • 创建了问题 4月11日