git(ssh)多用户配置

  适用场景:同一台电脑上两个或以上的用户,需要连接同一个git服务器。

  背景:公司项目服务基站设备,项目放在内网gitlab上。平时开发时,同事在各自的机器中配置ssh,从而提交代码。但是需要连接基站验证代码或者debug时,我们项目组同事共用同一台计算机来连接基站。这时如果在此台公用计算机上修改完代码并提交到gitlab时,这条修改记录的提交人就是此台计算机上当前配置了ssh公钥的同事,而不是自己。所以这个时候就需要在此计算机上加上自己的公私钥,并且设置自己项目的git配置,使得提交代码时(即,和gitlab服务器通信时),使用的是自己的公钥。

  【注意】上述的场景中,在同一台计算机中配置多人的公私钥是违背信息安全的(是这样么?)。在配置git设置时,用https的方式更为合理;使用ssh,只是方便每次与gitlab通信时免去输入用户名和令牌。

  不适用的场景:同一台电脑上的同一用户,连接不同的git服务器。比如,自己在自己的笔记本上,同时使用github、gitee,这时,仅需生成一对公私钥,将同一个公钥同时配置在自己的github和gitee上即可。

  接下来说正题:

  SSH使用非对称加密算法(RSA、ECC等)实现身份验证,通过C/S(client-server)模式来实现。其登录过程为:1.版本号协商阶段;2.密钥、算法协商阶段;3.认证阶段;4.会话请求阶段;5.会话交互阶段。我们在这里关关心的是“3.基于公私钥的认证阶段”:

  1. C端使用2阶段产生的“会话密钥”加密账号、认证方法、公钥(id_rsa.pub),发送给S端。
  2. S使用会话密钥解密报文,得到账号、公钥。S在此账号目录山的ssh目录中找到对应的公钥,若没有找到,发送失败信息给C;若找到,S生成随机字符串(简称“质询”),用公钥加密质询,再使用会话密钥再次加密。
  3. S将此双重加密结果给C。
  4. C先后使用会话密钥、私钥解密,得到质询。
  5. C使用会话密钥加密质询,发S。
  6. C使用会话密钥解密,得到质询,并判断是否是自己发出的质询,若相同,则认证通过。

  我们再配置git项目的时候,经常用  git clone 或者  git remote add  一个 ssh链接,形如:git@github.com:xxxxx/xxxxx.git。其中@符号前的"git"即上述的账号。

  

以下,以在一个计算机中为用户A、B分别配置自己的ssh公私钥对和git项目为例,分步骤讲解:

S1. 生成新的SSH密钥

  window中使用git bash / Linux中使用terminal,输入以下命令:

ssh-keygen -t ed25519 -C "A@example.com"  -f .ssh/id_ed25519_A
ssh-keygen -t ed25519 -C "B@example.com"  -f .ssh/id_ed25519_B

 ssh-keygen 命令选项:

-t:指定要创建的密钥类型;根据 Checking for existing SSH keys 说明,github对密钥类型的限制:1. 在2022/3/15后不再支持DSA算法;2. 2021/11/2之后只支持用SHA-2签名的RSA。

-C:添加注释;注意:这里的 your_email@example.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。即,只是个注释/标签,和你的gitub/gitee/gitlba网站注册的以邮箱命名的用户名无关。

-b:指定密钥长度;eg:ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

-f: output_keyfile

-p: [-f keyfile] 生成新的 passphrase;eg:$ ssh-keygen -p -f ~/.ssh/id_ed25519

  根据提示,需要输入三次回车。其中,第一次是为了确认输出的文件路径+名,直接按回车选用默认;第二次和第三次是确认 passphrase。passphrase是用来给ssh密钥加一层保护,防止有权限用你电脑的人再用你的公私钥操作其他事。可以使用ssh-agent保存passohase,这样就不必每次使用sshkey的时候都输入passphrase了。

S2.添加 SSH Key到 ssh-agent中(无需可跳过)

# start the ssh-agent in the background;在git bash中手动启动ssh-agent
$ eval "$(ssh-agent -s)"
> Agent pid xxxx

 

$ ssh-add ~/.ssh/id_ed25519_A
$ ssh-add ~/.ssh/id_ed25519_A

 

 

windows用户可以按照 Auto-launching ssh-agent on Git for Windows 中的说明,将ssh-agent随git bash自启动。

经过S2这一步骤的作用:只有第一次打开 git bash 时,才需要输入S1中设置的 passphrase(兼顾安全性和便捷性)。ssh-agentt进程将一直运行,直到注销、关闭计算机或杀死该进程为止。

S3.

 

 

 

 

 

 

#此文件重命名为 config,放置于/c/users/admin/.ssh/下

#本地多添加一对公私钥的步骤:
#1.ssh-keygen -t rsa 生成公私钥对
#2.ssh-add /c/users/admin/.ssh/id_rsa_zhangzhong // 将 zhangzhong 私钥添加到本地
#  若执行sh-add 出现这个错误:Could not open a connection to your authentication agent,则先执行如下命令:ssh-agent bash
#3.ssh-add -l 验证下

#一台电脑切换git用户的 原理:
#0.gitlab 仓库的ssh地址为:ssh://git@172.21.32.207:2022/sp-tooldev/SCMT.git
#1.在本地:git remote set-url origin git@gitlab-zhangzhong:sp-tooldev/SCMT.git
#2.git push时,自动将【host】(gitlab-zhangzhong)替换成 【HostName】:【Port】(172.21.32.207:2022)
#3.【User】实测没用,给git服务器上传的时候验证的是【Host】对应的【IdentityFile】
#4. git config --local user.name zhangzhong
#   git config --local user.email zhangzhong@datangmobile.com
#   这个还是有必要的,在本地仓库单独配置用户名信息,这样用 git log时,会显示修改记录:
#   Author: zhangzhong <houshangling@datangmobile.cn>
#   Date:   Thu Jun 3 15:51:02 2021 +0800
#
#       gituser switch test3
#  这个user信息只在本地git程序中使用,如上,我只修改了用户名,但是email没改,所以就了全局的user.email了
#  git config --list #查看当前配置/git config --list [--local] #查看当前仓库配置/git config --list --global #查看全局配置
#  config的三个作用域:local只对某个仓库有效(当前仓库目录的.git/config中)
#                      global对当前用户所有仓库有效(~/.gitconfig中(windows: C:\Users\admin\.gitconfig))
#                      system对系统所有登录用户有效

#验证:git服务器中project-activity中的记录 xx pusheh to branch,这个xx是匹配公钥的结果
#                 repository-commits中的 xx authored 5 minites ago,这里的xx是git config中的user.name + user.email
#所以name\email都需要设置

#Host server1 #仓库网站的别名,随意取
#HostName server1.cyberciti.biz #仓库网站的域名(PS:IP 地址应该也可以)
#User nixcraft #仓库网站上的用户名
#Port 4242
#IdentityFile /nfs/shared/users/nixcraft/keys/server1/id_rsa #私钥的绝对路径

#侯尚玲
Host gitlab-侯尚玲
HostName 172.21.32.207
Port 2022
User git
IdentityFile ~/.ssh/id_rsa
 
#zhangzhong
Host gitlab-zhangzhong
HostName 172.21.32.207
Port 2022
User git
IdentityFile ~/.ssh/id_rsa_zhangzhong

posted @ 2021-11-20 14:01  zzoozzoo  阅读(1129)  评论(0)    收藏  举报