2013年2月25日星期一

Ruby的psych错误

按照官方文档安装GitLab,执行有些命令时会出现如下警告:
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
我觉得这只是个警告,就没有处理。而且按照上面的说明,只是用于YAML输出的,应该没有大问题。

后面执行这一步
sudo -u gitlab -H bundle exec rake gitlab:setup RAILS_ENV=production
出了这样的错误。我没有处理,继续按后面的步骤操作。安装完后,GitLab的网页可以打开,但是用LDAP认证登录是出现类似错误:
Could not authorize you from Ldap because "Can't dump anonymous class class".
GitLab诊断文档说这个错误出现是因为没有用Ruby 1.9.3,可我是新装的Ruby 1.9.3啊。在这个issue里面发现我的错误与一开始被我忽略的psych错误可能有关,需要先解决psych的错误。

按照这个方法重新安装Ruby之后还是有错。后来觉得这个答案更适合我的情况,可还是未能解决。折腾了多次后无解,我觉得我的Ruby环境已经被搞乱了,决定按照GitLab的安装文档从头安装一遍Ruby。

最终通过重新安装Ruby解决了上述错误。至于Ruby没有psych的原因,是我犯错误没有执行其中一条安装依赖的命令(我看到公司Wiki上有人贴的过程说没有执行这步也可以,而实际是我看错了,他是执行了这一步的):
sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl git-core openssh-server redis-server postfix checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev
其中的libyam-dev没有安装,就导致Ruby没有了YAML的输出功能。

2013年2月5日星期二

SSH公钥认证的问题

在Gitolite上配置了公钥,对应的私钥放在用户A的.ssh目录下可以认证,而用户B的目录下认证则失败。区别在于用户A的.ssh目录下只有私钥id_rsa,而用户B的目录下除了私钥,还有一个老的公钥id_rsa.pub,这和私钥是不配对的。

经过对比,这俩用户下的私钥是一模一样的,.sshid_rsa的权限也都是正确的。

ssh-v参数,看到这两个用户的公钥认证的输出信息稍微有所不同。用户A的:
debug1: Next authentication method: publickey
debug1: Trying private key: /home/userA/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug2: we sent a publickey packet, wait for reply
debug1: Authentication succeeded (publickey).
用户B的:
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/userB/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp ef:a2:55:bc:86:1f:0a:48:e1:45:fc:b5:da:ca:70:e0
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password,keyboard-interactive
debug1: Trying private key: /home/userB/.ssh/id_dsa
用户A开始打出的是:Trying private key,而用户B打出的是:Offering RSA public key

最后实在看不出配置哪里有不同,就把用户B下面不相关的公钥id_rsa.pub移出去,然后认证成功了。因为我认为公钥不重要,认证看的是私钥,所以没有管那个无效的公钥。结果罪魁祸首竟然就是这个无关的公钥。

看来OpenSSH如果看到公钥文件名,则从公钥检查起,而这样不配对的私钥就认证失败了。而如果只放私钥,反而会成功。从这个文件里面也能验证这一点。