Post

git配置身份验证方式

Git的身份验证方式与启用的传输协议有很大相关性,目前有四种git客户端与服务器的传输协议。

本地协议

一般是将远程仓储的访问通过共享文件夹的方式提供出来。通常情况下,每个协作者都需要pull和push代码,意味着每个人都需要对共享文件夹有读写权限,其风险性不言自明。

HTTP协议

常见且易用的协议。其身份验证的方式为用户名+密码,每次与服务器交互时,会提示你输入用户名密码。如果想避免每次输入,可以将用户名密码存储到本地,具体方式为

1
2
git config --global credential.username myusername
git config --global credential.helper 'store <filepath>'

这条指令是告知git把credential保存至指定的filepath,如果不做路径指定,则默认存储至~/.git-credentials。
credential.helper实质是外部程序,它提供用户名与密码,需要实现git credential api,而store则是内置的已经实现了git credential api的程序,但是store是明文存储在本地的。也可以自己实现一个helper来加强安全性。
另外需要说明的是:credential是有上下文的,可以根据不同的url来定义不同的上下文,而上下文的作用就是存储前述helper所需的配置信息,如下:

1
git config --global credential.https://mygitserver.com.helper 'store --file ~/my_git_credential.txt'

这样的配置,意味着所有通过 https://mygitserver.com 与服务器的交互都用credential helper 为 store –file ~/my_git_credential.txt 的配置。而不符合此url的用户名与密码获取都通过global的配置进行。

写到这里不得不感叹一下,git的创建者Linus着实厉害,预留了system、global、repo-specific三层配置项,而且有很多类似git credential这种预留编程可扩展性的地方,也提供默认的内置实现来提高易用性。

SSH协议

SSH协议是通过密钥对来进行验证的,本地保留私钥,公钥存储至git服务器端。所以其关键是生成密钥对,并且告知git的客户端从哪里获取私钥、告知git的服务器从哪里获取公钥,让我们一起走一遍这个流程。
生成密钥对
在生成密钥对之前,需要先确定是否本机已经存在密钥对,一般SSH密钥存储在~/.ssh内:

1
2
3
4
cd ~/.ssh
ls
authorized_keys2  id_dsa       known_hosts
config            id_dsa.pub

我们需要寻找一对以 id_dsa 或 id_rsa 命名的文件,其中一个带有 .pub 扩展名。 .pub 文件是你的公钥,另一个则是私钥。如果找不到这样的文件(或者根本没有 .ssh 目录),可以通过运行 ssh-keygen 程序来创建它们。

1
2
3
4
5
6
7
8
9
10
$ ssh-keygen -t rsa -C "comments for this key pair" -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/schacon/.ssh/id_rsa):
Created directory '/home/schacon/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/schacon/.ssh/id_rsa.
Your public key has been saved in /home/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
d0:82:24:8e:d7:f1:bb:9b:33:53:96:93:49:da:9b:e3 schacon@mylaptop.local

至此,密钥对已经生成,在个人文件夹下会有.ssh文件夹,里面会有id_dsa 或 id_rsa 命名的文件。

告知git获取私钥
git使用ssh-agent来进行ssh协议传输,默认情况下ssh-agent会读取~/.ssh目录下的id_rsa或id_dsa文件。所以如果按照上述步骤进行,不需要在此做额外设置。

告知git服务器获取公钥
首先需要说明,这一步对于大部分git用户是不需要知道的,你只需把你的公钥给git管理员即可。大部分git服务器提供的SSH访问方式如下:在主机上建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥,然后将其加入 git 账户的 ~/.ssh/authorized_keys 文件。 这样一来,所有人都将通过 git 账户访问主机。 这一点也不会影响提交的数据——访问主机用的身份不会影响提交对象的提交者信息。

配置多组秘钥
当我们在多个git服务器上可能存在多组秘钥,比如个人和公司的作为区分,就会存在两个密钥对。此时需要我们进行多组秘钥的配置。首先,在.ssh 文件下创建config文件;然后将如下配置内容写入:

1
2
3
4
5
6
7
8
9
10
Host gitlab.company.com
    HostName    gitlab.company.com
    User    git
    IdentityFile    /c/Users/cnstevenwang/.ssh/id_rsa_cnstevenwang_company

Host github.com
    HostName    github.com
    User    git
    IdentityFile    /c/Users/cnstevenwang/.ssh/id_rsa_cnstevenwang_personal

可以分别进行多组秘钥验证。

Git协议

用的不是很多,暂时不做讨论

This post is licensed under CC BY 4.0 by the author.