我可以让 SSH ForwardAgent 和 ProxyJump 与 Git 一起工作吗?

Posted

技术标签:

【中文标题】我可以让 SSH ForwardAgent 和 ProxyJump 与 Git 一起工作吗?【英文标题】:Can I make SSH ForwardAgent and ProxyJump work with Git? 【发布时间】:2021-12-03 14:16:32 【问题描述】:

我有两台电脑;我的工作站和一台笔记本电脑用来运行我的公司 ***。我需要通过 *** 才能访问我的 Git 远程 (BitBucket)。

我的工作站上运行了一个 SSH 代理,其中包含连接到 Git 远程所需的 SSH 密钥。我已将 SSH 配置为在连接到笔记本电脑时转发我的 SSH 代理:

Host my-laptop
    ForwardAgent yes

如果我使用 SSH 连接到我的笔记本电脑,我可以成功git pull,并且ssh-agent -l 确认 SSH 代理已正确转发。到目前为止一切顺利!

挑战如下:我想直接从我的工作站使用 git。这应该可能是通过我的笔记本电脑将 SSH 配置为代理。我的 git 遥控器看起来像这样:

➜ git remote -v
origin  ssh://git@bitbucket.my-company.com:7999/my-team/my-project.git (fetch)
origin  ssh://git@bitbucket.my-company.com:7999/my-team/my-project.git (push)

所以我添加了这个 SSH 配置:

Host *.my-company.com
    ProxyJump my-laptop

代理跳转成功了,因为现在我到达了 Git 遥控器! ????

但是,身份验证失败:

git@bitbucket.my-company.com:权限被拒绝(公钥)。 致命:无法从远程存储库读取。

请确保您拥有正确的访问权限 并且存储库存在。 退出状态 128

所以在代理命令时显然 SSH 代理转发不起作用..?

我尝试过的故障排除步骤:

使用 SSH 连接到笔记本电脑并运行 git pull - 它可以工作

直接在笔记本电脑上运行git pull - 它可以工作

添加IdentityFileIdentitiesOnly 以强制使用正确的键,没有任何区别:

Host *.my-company.com
    ProxyJump my-laptop
    IdentityFile ~/.ssh/hubro@my-company.com.key
    IdentitiesOnly yes

在连接Git远程主机时添加ForwardAgent yes,并没有什么区别:

Host *.my-company.com
    ProxyJump my-laptop
    ForwardAgent yes
    IdentityFile ~/.ssh/hubro@my-company.com.key
    IdentitiesOnly yes

那么为什么在运行 git 命令时不使用我的本地 SSH 代理?

【问题讨论】:

似乎使用此 ProxyJump 配置执行代理转发,因为您运行的是 ssh user@host.my-company.com,而不是 ssh user@my-laptop。告诉 ssh 在其他配置中或使用 -A 进行代理转发可能会让您继续(我自己没有尝试过)。但是,另请参阅unixetc.co.uk/2017/11/13/ssh-proxying-and-agent-forwarding - 或“tl;dr”警告,当使用代理转发时,您将密钥提供给中间系统上的任何超级用户。 (这里可能不是太大的问题。) @torek 这很有道理,但我试过了,不幸的是它没有任何作用 在这种情况下,无论如何,请查看链接 - 它为您提供了一种不同的处理方式。 请尝试ssh -vvv git@bitbucket.my-company.com -p7999 并显示结果,也许您有太多可能的键 @jeb 确认!我用 ssh-ed25519 类型的 SSH 密钥 (ssh-keygen -t ed25519) 替换了我的 SSH 密钥,现在它可以工作了!一直以来的问题是我的系统太新了???? 【参考方案1】:

事实证明,在这个设置中我什至不需要 SSH 代理转发,因为 ProxyJump 设置设置了一个隧道,让我的工作站可以“直接”与 git 远程通信。

我收到“Permission denied (publickey)”错误的原因是我的发行版 (Arch) 是最新的,并且默认情况下已经禁用了对“ssh-rsa”密钥的支持。 (在撰写本文时,Arch linux 附带 openssh 8.8p1)

令人沮丧的是,我用“rsa-sha2-512”生成我的密钥并不重要,这应该是安全的,我的 SSH 客户端仍然没有它。

但是,我改用 ed25519 生成了一个新密钥,这解决了我的问题。

$ ssh-keygen -t ed25519

【讨论】:

【参考方案2】:

在您的情况下,您不需要代理转发,因为您不想将密钥转发到 bitbucket.my-company.com 服务器,您只想在那里进行身份验证。

转发中间代理拥有的密钥不能使用ForwardAgent

您需要工作站上的正确密钥,但该密钥似乎只存在于您的笔记本电脑上 (Running git pull directly from the laptop - it works)。

    您可以将私钥从笔记本电脑复制到工作站 您可以将密钥从笔记本电脑转发到一个终端中的工作站,然后在另一个终端中将该密钥与 git 一起使用

【讨论】:

我的工作站上肯定也有钥匙。它已加载到我的本地 SSH 代理中。如果我 SSH 到我的笔记本电脑启用 ForwardAgent,我可以从 git 远程成功地git pull。如果我使用 ForwardAgent disabled (ssh -o ForwardAgent=no ...) SSH 到我的笔记本电脑,那么 git pull 会失败。 @Hubro 但是你写道,如果你直接从你的笔记本电脑上使用它,而你的工作站没有 ForwardAgent,它也可以工作 抱歉,当我说“直接从笔记本电脑”时,我的意思是物理上在笔记本电脑上,而不是通过 SSH。我在笔记本电脑上有一个 SSH 代理,添加了相同的 SSH 密钥。当我直接在笔记本电脑上打开终端时,会使用本地 SSH 代理。当我在禁用 SSH 代理转发的情况下通过 SSH 连接到笔记本电脑时,没有使用 SSH 代理并且git pull 失败。我不确定为什么会这样。 @Hubro 在笔记本电脑和工作站的代理中存储了多少密钥?你也可以试试ssh -o IdentitiesOnly=yes git@bitbucket.my-company.com -p7999

以上是关于我可以让 SSH ForwardAgent 和 ProxyJump 与 Git 一起工作吗?的主要内容,如果未能解决你的问题,请参考以下文章

mac配置私钥转发

制作可以ssh的镜像发布到k8s

ssh-agent 和 crontab - 有没有让这些满足的好方法?

SSH -R 远程端口转发

如何让 SSH 在 Kubernetes 上运行?

docker网络