You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:37:37