我有两台电脑;我的工作站和一台我用来运行公司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
-它工作添加
IdentityFile
和IdentitiesOnly
来强制使用右键,没有什么区别: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
)。
- 您可以将私钥从笔记本电脑复制到工作站
- 您可以将密钥从笔记本电脑转发到您的工作站的一个终端,并在另一个终端中使用git密钥