我需要自己搭建一个git服务器,设置好仓库目录后,执行git clone后,每次git push都需要输入密码。于是想到使用ssh的公钥登录的方式。
一、在本地生成public key
得到如下的共有key
1
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTe/HXz0mpOyzJ6QcCI2/uP/fmU0MLQ3ewglRa0Y2Ym4Jm5tNhjCa40mRTN7eCX7ufCRnTR8JurFURC5dNa5vNAh3JqeiBs1gGaemAe4VjfJzUTtPO9KPyXZRyoa5j4+XOY39al/n2lHz2ydcmncxmdw8JAfx53IZY2ruZAI32h/bgqc8zmz4eqhQn3wGSG81a7vTw7JLWAna6Ey34VxGYJYPTzJJFa+STibESDIea4GFl93xD02/+8ScpqxD419A+XQGtAzypuKX8LAXXdOz9GNS/F2B+wMEYyygzQjQXoKS0lJqcycvC/uF/hy5D/1H5MLMnPKgNpRt7/AgTyfLbFjsy12rdfiQMgTjLhiPJ068GjVpbJhvEO77OB4dawGoATXqOv3oU7V2/N5/cm7aRzdUmNw9/MWfGWPtjMKrhSyCnWNDqH9bh7Lewe0DkL2HsPzV32DISE/qai019R6FmL7N1xNKeGIuixN7uCNjAKQ3HoW8= Administrator@MC-PC1
|
二、复制公有key到服务器
将本地的公有key复制到服务器的git用户下,路径为【/home/git/.ssh/authorized_keys】
三、执行git push
git的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = git@www.abc.com:/data/gitstore/shidao-dms.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master
|
执行git push结果如下,可以看到,还是需要输入密码才有效。
四、问题分析
使用ssh登录的工作原理是,客户端连接服务器的时候,服务器向客户端发送一个字符串,客户端收到字符串后使用私钥对该字符串进行加密,然后将密文发送给服务器,服务器用公钥对其进行解密,如果正确,那么就授权登录,如果失败,就决绝。
1、当前是使用的ssh的连接方式吗
使用抓包工具来查看,其实一般不用查看,只要使用的是git@xxx.com:/git/path.git这样的形式,那肯定就是ssh形式
2、客户端使用的是哪个私钥进行加密的
这里有个疑问,家目录下面存在多个私钥,那么系统如何知道使用的是哪个key来进行加密的呢?虽然不知道使用的哪个,那么,如果只要一个私钥文件,那么是不是就不用管了呢?所以如果有多个的时候,删除掉多余的,只保留一个就行了。
3、服务器使用的哪个公钥进行解密的
这个很重要。linux服务器有关于ssh的相关配置。主要的配置在
1 2 3 4
| RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
|
配置完毕后,记得要重启ssh服务
1 2 3 4 5 6 7 8
| service ssh restart
/etc/init.d/ssh restart
service sshd restart
|