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



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

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

Host my-laptop
ForwardAgent yes

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

挑战来了:我想在我的工作站上直接使用git。这应该可以通过我的笔记本电脑将SSH配置为代理。我的git remote是这样的:

➜ 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: Permission denied (publickey)。
fatal: Could not read from remote repository.

请确保您有正确的访问权限
并且存储库存在。
退出状态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代理呢?

在这个设置中我甚至不需要SSH代理转发,因为ProxyJump设置设置了一个隧道,让我的工作站"直接"通信。

获取"Permission denied (publickey)"的原因错误原来是我的发行版(Arch)非常最新,并且已经禁用了对"ssh-rsa"的支持。默认为Keys。(在撰写本文时,Arch linux附带了openssh 8.8p1)

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

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

$ ssh-keygen -t ed25519

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

转发中间代理拥有的密钥在ForwardAgent中是不可能的。

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

  1. 您可以将私钥从笔记本电脑复制到工作站
  2. 您可以将密钥从笔记本电脑转发到您的工作站的一个终端,并在另一个终端中使用git密钥