通过SSH隧道连接到gitosis服务器

10
我已在我的Macbook上设置了一个SSH隧道,如下所示...
$ ssh -o ServerAliveInterval=3 -N -L 22222:gitosis-server:22 user@firewall.domain.com
这样我就可以通过ssh到localhost:22222并最终进入防火墙后面的gitosis服务器。
我创建了一个本地id_rsa.pub文件,将其复制到运行Centos5的gitosis服务器中,并使用以下命令将其导入到gitosis中...
# sudo -H -u gitosis gitosis-init
它成功了,因为我在/var/lib/gitosis/.ssh/authorized_keys中看到了公钥。
回到我的Macbook上,我设置了一个~/.ssh/config文件,其中包含以下内容...
Host gitosis-server
Hostname localhost
HostKeyAlias gitosis-server.domain.com
Port 22222
所以,我认为这个命令应该可以工作...
$ git clone gitosis@gitosis-server:gitosis-admin.git
但它没有工作,因为它要求输入密码...而公钥应该是有效的。
Initialized empty Git repository in /Users/USER/Development/gitrepo/gitosis-admin/.git/
gitosis@localhost's password: 
有关在防火墙后面的gitosis服务器上获取git工作的任何想法吗?
感谢,Matt
编辑-添加来自SSH尝试的调试信息
我执行了这个命令,'ssh -vvv gitosis@gitosis-server'。我得到一些调试信息,它似乎不喜欢我的Identity。
debug2: key: /Users/USER/.ssh/id_rsa.gitosis (0x1019b0)
debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug3: start over, passed a different list publickey,gssapi-with-mic,password
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1:提供公钥:/Users/USER/.ssh/id_rsa.gitosis debug3:发送公钥测试 debug2:我们发送了一个公钥数据包,等待回复 debug1:可以继续进行的验证:publickey,gssapi-with-mic,password debug2:我们没有发送数据包,禁用此方法 debug3:查找身份验证方法 password debug3:剩余首选项:,password debug3:启用的身份验证方法 password debug1:下一个身份验证方法:password gitosis@localhost's password:

EDIT 2

好吧,肯定是有问题的密钥。我再次仔细检查了所有的密钥,发现 gitosis-server 在 authorized_keys 文件中持有一个不良的密钥。

debug1:对于用户gitosis,服务为ssh-connection,方法为none的用户认证请求 debug1:尝试0次失败0次 debug1:PAM:为“gitosis”初始化 debug1:PAM:将PAM_RHOST设置为“firewall.domain.com” debug1:PAM:将PAM_TTY设置为“ssh” debug1:对于用户gitosis,服务为ssh-connection,方法为publickey的用户认证请求 debug1:尝试1次失败1次 debug1:测试pkalg/pkblob是否可接受 debug1:临时使用uid:102/103(e=0/0) debug1:尝试公钥文件/var/lib/gitosis/.ssh/authorized_keys debug1:恢复uid:0/0 debug1:临时使用uid:102/103(e=0/0) debug1:尝试公钥文件/var/lib/gitosis/.ssh/authorized_keys2 debug1:恢复uid:0/0 来自FIRE.WALL.IP.ADDRESS端口52453 ssh2的gitosis的公钥验证失败

我仔细查看了gitosis服务器上的authorized_keys文件,发现它不正确。我再次检查了我从工作站复制到/tmp的公钥文件,确认它是正确的,但与authorized_keys中的内容不同。我删除了服务器上的authorized_keys文件,然后重新运行'sudo -H -u gitosis gitosis-init < /tmp/id_rsa.gitosis.pub'命令。再次检查authorized_keys文件,但它仍然是错误的。
我手动更新了它,通过编辑authorized_keys并添加正确的密钥,然后通过隧道从我的工作站访问成功了一两次。然后它又停止工作了。我回到了gitosis服务器上的authorized_keys文件,确实......gitosis已将其恢复为旧的、无法工作的密钥。
为什么会这样呢?即使我尝试使用上述命令添加它(未能更改它),然后手动更改它(可以正常工作),但git仍然会将其恢复回不良密钥。
好像gitosis一直记得我放在那里的第一个密钥....而且不允许我将其更改为更正的密钥。
很令人沮丧...
Matt
5个回答

4

跟进:

我不确定为什么gitosis坚持重复使用错误的公钥。试图强制它接受正确的密钥并没有起作用。

所以今天我只是在我的CentOS5盒子上删除并重新安装了gitosis包。

yum remove gitosis
rm -rf /var/lib/gitosis
yum install gitosis
sudo -H -u gitosis gitosis-init < /tmp/id_rsa.gitosis.pub  #正确的密钥

在我的Mac上,我通过防火墙将localhost:22222 SSH隧道连接到gitosis-server:22。

$ ssh -o ServerAliveInterval=3 -N -L 22222:gitosis-server:22 user@firewall.domain.com

在我的Mac上,我创建了一个看起来像这样的~/.ssh/config文件...

Host gitosis-server
Hostname localhost
IdentityFile ~/.ssh/id_rsa.gitosis
HostKeyAlias gitosis-server.domain.com
  Port 22222

然后...按照这个网站上的说明...

http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way

...从"这里发生了一些神奇的事情。在您的本地机器上运行以下命令:" 开始的所有内容...都可以正常工作...只是记得用"gitosis"替换用户名"git"。

希望这一切能对某人有所帮助。还要感谢我在这里得到的建议...它们有助于缩小问题范围。

Matt


2

我在类似情况下的设置(工作)

我有一个类似的设置用于repo.or.cz(由于我使用的波兰ISP Telekomunikacja S.A.(tpnet)的某种原因被空路由阻止),并且对我有效:

在尝试连接之前,我运行以下命令来设置SSH隧道:

$ autossh -M 20000 -f -N -L 2222:repo.or.cz:22 user@gateway.example.com

我使用autossh代替ssh来重新连接,以保持连接状态。请确保适当的身份验证已添加到SSH身份验证代理:

$ ssh-add -l
2048 d7:d3:69:f5:0f:f9:5e:aa:e0:0b:28:c2:03:42:09:66 /home/user/.ssh/id_dsa_gateway.example.com (DSA)
1024 11:a2:29:fe:37:12:a7:33:c4:23:b0:e1:82:92:e0:6a /home/user/.ssh/id_dsa_repo.or.cz (DSA)

我使用keychain,只需在登录时提供一次密码即可为我的私有SSH密钥提供密码。

我在~/.ssh/config中做了以下设置:

Host repo.or.cz
        # NoHostAuthenticationForLocalhost yes
        HostName localhost
        Port 2222

这个设置对我来说没有问题。


调试您的情况

至于调试您的情况?

首先,我会检查是否可以使用“ssh user@firewall.domain.com”登录到网关,以检查是否可以建立SSH隧道。如果您使用Linux,则可以使用例如netstat --tcp检查是否已建立与网关的连接;在其他操作系统和环境中,您可以找到类似的实用程序。

检查是否可以正确连接到gitosis。(如果我没记错,gitorious正在使用gitosis通过SSH进行访问管理,因此我在下面的示例中使用了来自gitorious的响应)

$ ssh gitosis@gitosis-server
Need SSH_ORIGINAL_COMMAND
                             Connection to  closed.

如果它没有执行类似上面的操作(repo.or.cz返回“fatal: What do you think I am? A shell?”,GitHub返回“Hi user!You've successfully authenticated, but GitHub does not provide shell access.”),请通过“ssh -v gitosis@gitosis-server”检查失败的位置:

$ ssh -v gitosis@gitosis-server
[...]
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/user/.ssh/id_dsa_gitosis-server
debug1: Remote: Forced command: gitosis-server user
[...]
debug1: Authentication succeeded (publickey)

Charles/Jakob....我发现id_rsa.gitosis和id_rsa.gitosis.pub的身份是644....我将它们改为了700。但似乎并没有什么区别。我将一些调试信息粘贴到原问题中。 - Matt Mencel

2
这是一个关于ssh的问题,而不是(目前)git的问题。 ssh -v是你的好朋友,因为它会提供有关ssh正在尝试使用哪些身份验证方法和密钥的调试信息。
我发现十有八九是密钥文件权限的问题。 ssh 喜欢只对“用户”可写的.ssh目录和id_rsa文件。我的umask默认允许组可写文件。 ssh -v将告诉您是否在您的情况下存在这种情况。 编辑 看起来sshd服务器不接受您的身份。 我不知道您是否可以访问远程服务器,但在调试模式下运行sshd服务器可能会有所帮助。
像这样运行一些内容允许在给定端口上进行一次连接(因此不会中断正常的sshd服务),并输出调试信息。 这可能有助于调试服务器为什么不喜欢您的身份。
sshd -d -p 2022

如果你的“正常”的sshd服务运行时带有额外的参数,请确保将这些参数也提供给调试版本。


嗨,查尔斯...谢谢你提供的信息。我在服务器上进行了调试,并找出了问题所在...但仍未解决问题。请查看我在原始问题中的编辑。谢谢, 马特 - Matt Mencel

1

你说你可以成功地通过ssh连接到localhost:2222。为了检查你是否正确设置了~/.ssh/config,你能否尝试仅通过ssh连接到gitosis-server

ssh gitosis-server

如果我使用“ssh gitosis-server”命令,它会连接到我的当前用户帐户(该帐户也存在于gitosis服务器上)。因此,当我输入密码时,它可以成功登录。 - Matt Mencel

0

我曾经遇到过类似的问题,我用以下方法解决了它:

[srydberg@zeus ~]$ echo $SSH_AUTH_SOCK
/tmp/keyring-KXX3Aw/ssh
[srydberg@zeus tmp]$ sudo rm -rf keyring-KXX3Aw/

也许你的密钥被缓存在那里了?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接