go-git通过SSH代理身份验证失败,如何正确配置用户名完成认证?
go-git通过SSH代理身份验证失败,如何正确配置用户名完成认证?
看起来你遇到的问题核心是SSH认证时的用户名配置错误,我来帮你快速解决这个问题:
问题根源
你在调用ssh.DefaultAuthBuilder("keymaster")时传入的"keymaster"是错误的用户名——对于GitHub的SSH仓库来说,认证时固定需要使用git作为用户名,而不是你本地的用户名或者自定义的密钥别名。这就导致SSH握手时,GitHub无法识别这个用户名,直接拒绝了认证请求。
解决方案:修改用户名参数
只需要把代码里的用户名替换成git即可,修改后的代码如下:
package main import ( "log" "os" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/transport/ssh" ) func main() { // 这里把"keymaster"改成"git" authMethod, err := ssh.DefaultAuthBuilder("git") if err != nil { log.Fatalf("default auth builder: %v", err) } if _, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{ URL: "git@github.com:org/repo.git", Progress: os.Stdout, Auth: authMethod, }); err != nil { log.Fatalf("plain clone: %v", err) } }
额外验证步骤
为了确保你的SSH代理配置本身没有问题,可以先在终端执行以下命令测试GitHub的SSH连接:
ssh -T git@github.com
如果返回类似Hi <your-username>! You've successfully authenticated, but GitHub does not provide shell access.的内容,说明你的SSH代理和密钥配置是正常的,只需要修改go-git代码里的用户名就能解决问题。
补充:多密钥场景的处理
如果你的SSH代理里存储了多个密钥,担心go-git找不到正确的那一个,可以手动指定密钥的指纹来精准匹配,示例代码如下:
// 先获取SSH代理客户端 agent, err := ssh.NewAgent() if err != nil { log.Fatalf("create agent: %v", err) } defer agent.Close() // 指定要使用的密钥指纹(可以通过ssh-add -l查看) keys, err := agent.List() if err != nil { log.Fatalf("list keys: %v", err) } var targetKey ssh.PublicKey for _, k := range keys { if k.Type() == ssh.KeyAlgoED25519 && string(k.Marshal()) == "your-key-fingerprint" { targetKey = k break } } // 基于指定的密钥创建认证方法 authMethod, err := ssh.NewSSHAgentAuth("git", targetKey) if err != nil { log.Fatalf("ssh agent auth: %v", err) }
不过大多数情况下,只需要修改用户名参数为git就能解决你的认证问题啦。
备注:内容来源于stack exchange,提问作者Kurt Peek
相关产品推荐
相关产品推荐

