Git使用ed25519算法SSH密钥pull/push时每次均要求输入密码
问题描述
- 对接GitHub、GitLab平台时,使用ed25519算法生成的SSH密钥执行
git pull、git push操作,每次都会被要求输入密码,无法完成免密身份校验 - 切换为rsa算法生成的SSH密钥后,所有Git操作均可正常执行,无需额外输入密码或完成其他验证,两个平台测试结果完全一致
- 在
~/.ssh目录下编写config文件单独指定ed25519密钥路径时,执行ssh -T git@github.com仍提示需要输入密码;将config配置修改为指定rsa密钥路径后,执行同一条命令可直接通过身份验证 - 补充:config文件中排序靠前的密钥为ed25519类型,靠后的为rsa类型
解决方案
ed25519密钥无法免密验证是非常常见的配置问题,按以下步骤逐一排查即可解决:
- 检查ed25519私钥是否设置了口令且未加入ssh-agent缓存
执行命令验证私钥状态:
如果执行后直接输出以ssh-keygen -y -f ~/.ssh/你的ed25519私钥实际路径ssh-ed25519开头的公钥内容,说明私钥未设置口令;如果提示输入passphrase,说明生成密钥时设置了保护口令,且没有把密钥加入SSH代理的缓存,这是每次操作都要求输密码的最常见原因。
修复方式:- 先启动SSH代理:
eval "$(ssh-agent -s)" - 将ed25519私钥加入代理缓存:
ssh-add ~/.ssh/你的ed25519私钥实际路径,按提示输入一次密钥口令后,后续所有操作都不会重复要求输入。 - macOS用户可以执行
ssh-add --apple-use-keychain ~/.ssh/你的ed25519私钥实际路径,将口令存入系统钥匙串,设备重启后也不需要重复加载密钥。
- 先启动SSH代理:
- 修正文件权限
SSH对目录、配置文件、私钥的权限有严格要求,权限不符合规则时会直接忽略对应文件,导致密钥加载失败。执行以下命令修正权限:chmod 700 ~/.ssh chmod 600 ~/.ssh/config chmod 600 ~/.ssh/id_ed25519 # 替换为你实际的ed25519私钥文件名 chmod 644 ~/.ssh/id_ed25519.pub - 修正config配置规则
单独指定ed25519密钥的配置段必须添加IdentitiesOnly yes参数,否则SSH会默认优先尝试加载代理中缓存的其他密钥、默认路径下的其他密钥,导致密钥匹配失败回退到密码验证。正确配置参考:
GitLab的配置只需要把Host、HostName替换为GitLab对应的域名即可。Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yes - 校验平台侧上传的公钥正确性
执行cat ~/.ssh/id_ed25519.pub查看本地ed25519公钥内容,和GitHub/GitLab SSH密钥设置页已上传的公钥逐字符比对,确认没有多复制空格、换行,也没有错将rsa公钥上传。ed25519公钥固定以ssh-ed25519开头,rsa公钥固定以ssh-rsa开头,可以靠这个前缀快速区分。 - 调试定位具体错误
如果以上步骤操作完仍有问题,执行带调试参数的连接命令:
输出的调试日志会明确显示SSH尝试加载的密钥路径、认证阶段的返回结果,直接根据日志提示的错误点修复即可。ssh -vT git@github.com
内容的提问来源于stack exchange,提问作者Nauxscript
相关产品推荐
相关产品推荐

