推荐使用 ssh-keygen -t ed25519 -c "your_email@example.com" 生成 github 兼容密钥;若用 rsa,须指定 -b 4096;密钥默认存于 ~/.ssh/id_ed25519,避免覆盖;务必设密码保护私钥;ssh-add 报错需先启动 ssh-agent 并检查 ssh_auth_sock 环境变量。

怎么用 ssh-keygen 生成兼容 GitHub 的密钥
GitHub 只接受 ed25519 或带 -b 4096 的 rsa 密钥,老式默认 ssh-keygen(如 macOS 12 以前或旧 Linux)会生成弱强度的 2048 位 RSA,直接被 GitHub 拒绝。
- 强制指定算法和长度:
ssh-keygen -t ed25519 -C "your_email@example.com"(推荐) - 如果必须用 RSA:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" - 密钥默认存到
~/.ssh/id_ed25519,别手抖输错路径;如果已存在同名文件,ssh-keygen不会覆盖,而是报错“already exists”,得手动删或换名 - 密码(passphrase)可为空,但不建议——空密码 = 私钥文件一旦泄露,立刻等同于账号沦陷
为什么 ssh-add 报错 “Could not open a connection to your authentication agent”
这不是密钥问题,是 ssh-agent 根本没运行。macOS 和新版 Windows WSL2 默认启动它,但很多 Linux 发行版(尤其最小化安装)或终端复用场景(如 tmux、screen)里它是关闭的。
- 先检查:
ssh-add -l,若报错就说明 agent 没起来 - 启动并注入密钥:
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_ed25519 - 想开机自动加载?别往
~/.bashrc直接写ssh-agent启动命令——它会每次新开终端都起一个新进程,导致 agent 堆积;应加判断:if [ -z "$SSH_AUTH_SOCK" ]; then eval "$(ssh-agent -s)"; fi
GitHub 上添加公钥后仍提示 Permission denied (publickey)
常见原因是 SSH URL 写错、Git 配置没切到 SSH 模式,或者 GitHub 账号绑错了邮箱。
- 确认远程地址是 SSH 格式:
git remote set-url origin git@github.com:username/repo.git,不是https://... - 测试连接:
ssh -T git@github.com,成功返回 “Hi username! You've successfully authenticated…” 才算通 - 如果返回 “Hi other_user!”,说明你本地
~/.ssh/id_*.pub对应的私钥,绑的是另一个 GitHub 账号——GitHub 不认邮箱,只认公钥指纹,一个公钥只能绑一个账号 - 多个账号需配置
~/.ssh/config,例如区分github.com和github-work.com,否则所有请求都走默认密钥
Windows 用户用 Git Bash 连不上?重点查 OpenSSH 版本和路径
Git for Windows 自带的 ssh 和系统 OpenSSH(PowerShell 里的)可能冲突,且旧版 Git Bash(ed25519。
- 在 Git Bash 中运行:
ssh -V,输出含OpenSSH_8.0p1或更高才安全;低于此版本请升级 Git for Windows - 确保用的是 Git Bash 自带的
ssh,不是 Windows 系统 PATH 里的:which ssh应返回/usr/bin/ssh,而非/c/Windows/System32/OpenSSH/ssh.exe - 私钥路径不能含中文或空格,
ssh-add会静默失败;~/.ssh/id_ed25519最稳
最常被忽略的点:GitHub 不验证邮箱真实性,只靠公钥绑定账号。你用 A 邮箱生成密钥、却把公钥贴到 B 邮箱的 GitHub 账户上,ssh -T 仍会成功,但 push/pull 操作会因权限不足被拒绝——错误信息是 “Permission denied (publickey)”,而不是 “account not found”。这时候得去 GitHub Settings → SSH and GPG keys 页面,核对公钥指纹是否匹配本地 ssh-keygen -lf ~/.ssh/id_ed25519 输出的 SHA256 值。











