如何让SSH自动尝试.ssh/config中同一主机的多个IdentityFile
问题分析
你遇到的核心问题是:在同一Host块下配置多个IdentityFile后,GitHub拒绝第一个密钥时,SSH客户端未继续尝试第二个密钥。这并非OpenSSH的默认行为,通常是配置细节或Windows环境下的权限问题导致的。
解决方案
1. 修正SSH配置文件
确保你的~/.ssh/config(Windows下路径为C:\Users\<你的用户名>\.ssh\config)中GitHub主机的配置如下,显式启用公钥认证并指定多个身份文件:
Host github.com HostName github.com User git PubkeyAuthentication yes IdentityFile ~/.ssh/id_rsa_first # 替换为你的第一个私钥路径 IdentityFile ~/.ssh/id_rsa_second # 替换为你的第二个私钥路径
- 无需设置
IdentitiesOnly yes,除非你明确想忽略ssh-agent中的密钥(该参数不影响多密钥的顺序尝试)。
2. 检查私钥文件权限(Windows关键步骤)
Windows上的OpenSSH对私钥权限要求严格,若私钥被其他用户/组访问,会被客户端拒绝使用:
- 右键私钥文件 → 属性 → 安全 → 高级
- 点击禁用继承,选择将继承的权限转换为此对象的显式权限
- 删除所有非当前用户的权限条目,仅保留你自己的读取权限
- 确认后保存设置
3. 验证密钥尝试流程
通过调试日志确认SSH是否在尝试所有密钥:
打开命令提示符或PowerShell,执行:
ssh -vT git@github.com
查看输出日志,若看到类似以下内容,说明客户端正在依次尝试每个密钥:
debug1: Offering public key: ... id_rsa_first RSA SHA256:...
debug1: Authentications that can continue: publickey
debug1: Offering public key: ... id_rsa_second RSA SHA256:...
如果日志仅出现第一个密钥,需检查配置是否生效;如果两个密钥都被尝试但第二个仍被拒绝,要确认该密钥是否已正确添加到对应GitHub账号的SSH密钥列表中。
4. 清空ssh-agent缓存(可选)
若ssh-agent缓存了旧密钥信息,可能干扰尝试顺序,执行以下命令清空缓存:
ssh-add -D
之后可重新添加密钥(可选,未设置IdentitiesOnly yes时,SSH会自动尝试配置文件中指定的私钥):
ssh-add ~/.ssh/id_rsa_first ssh-add ~/.ssh/id_rsa_second
内容的提问来源于stack exchange,提问作者EzioMercer

