Git的GPG的用法

本文主要介绍gpg key的生成和用法

一.概述

ssh用于身份鉴权,可push代码。
但是git的commit里,可以随意git config user.email,所以任何人都可以设置提交的邮箱,这里存在篡改的可能,github也确实出现过这类问题。
所以引入了gpg key,用于对commit进行签名。
如果你用了gpg key对commit进行签名,那么repor的提交记录里,你的信息会有个“已认证”"Verified"的样式,如下:
图片

你可能需要先安装gpg,mac通过Homebrew,再安装gpg:

1
brew install gpg

二.核心用法

核心需要设置user.email,需要和你的gpg key一致,然后设置你的仓库使用gpg并关联上你的gpg key,最后在commit的时候,进行关联:

#核心需要设置user.email
git config user.name 'Thomas'
git config user.email 'thomas@gmail.com'
#开启gpg 签名
git config commit.gpgsign true
#关联你的key的id,id的生成参见下面的段落
git config user.signingkey 26CBB52DA8524384
#commit时,添加-S指令用于签名
git commit -S -m "first commit"

三.生成

gpg --full-generate-key

你会看到如下字样:

1
2
3
4
5
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)

输入1并回车,你会看到:

1
2
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)

你最好输入4096,最长的密钥

1
2
3
4
5
6
7
8
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)

会提示你选择过期范围,建议你选择一个有效期,然后会问你以上信息是否正确,如下:

1
2
Key does not expire at all
Is this correct? (y/N)

输入y,然后接下来会让你输入姓名等信息,这些不重要,但是邮箱很重要,这里的邮箱需要和你设置的git config user.email thomas@gmail.com完全一直

1
2
3
4
5
6
7
8
Real name: thomas
Email address: thomas@gmail.com
Comment:
You selected this USER-ID:
"thomas <thomas@gmail.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

最后输入O,代表OK。

然后会要求输入这个key的密码,根据操作系统不同,可能会弹窗要求你输入key的密码,输入完成之后,会给你看结果,大致如下:

1
2
3
4
pub   rsa4096 2020-02-06 [SC]
CE9ECA454E8243E95C7D96FF26CBB52DA8524384
uid thomas <thomas@gmail.com>
sub rsa4096 2020-02-06 [E]

注意,不要生成phrase,否则后续使用会有些麻烦。
如果一定要生成phrase,需要添加环境变量,否则在某些情况下,不会提示你输入密码,会直接报错:

1
export GPG_TTY=$(tty)

这里没有展示key的id,你需要继续输入:

gpg --list-secret-keys --keyid-format LONG

你会得到类似下面的东西

1
2
3
4
sec   rsa4096/26CBB52DA8524384 2020-02-06 [SC]
CE9ECA454E8243E95C7D96FF26CBB52DA8524384
uid [ultimate] thomas <thomas@gmail.com>
ssb rsa4096/CE2FED2FE29A7485 2020-02-06 [E]

这里的26CBB52DA8524384就是你的gpg key的id,非常重要,下面要根据这个id导出key的公钥:

1
gpg --armor --export 26CBB52DA8524384

将导出的公钥录入到github上。
然后再参照第二段里的核心用法进行使用即可

四.导入导出

4.1.查看密钥

1
gpg --list-secret-keys --keyid-format LONG

输出如下:

1
2
3
4
sec   rsa4096/26CBB52DA8524384 2020-02-06 [SC]
CE9ECA454E8243E95C7D96FF26CBB52DA8524384
uid [ultimate] thomas <thomas@gmail.com>
ssb rsa4096/CE2FED2FE29A7485 2020-02-06 [E]

这一次,用如CE9ECA454E8243E95C7D96FF26CBB52DA8524384作为Keyid

4.2.导出

导出公钥:

1
2
3
4
#输出到控制台
gpg --a --export 26CBB52DA8524384
#导出到文件
gpg -a -o public-file.key --export CE9ECA454E8243E95C7D96FF26CBB52DA8524384

导出私钥:

1
gpg -a -o private-file.key --export-secret-keys CE9ECA454E8243E95C7D96FF26CBB52DA8524384

4.3.导入

将公钥和私钥直接import即可

1
2
gpg --import public-file.key
gpg --import private-file.key

4.4.删除

1
gpg --delete-secret-key 26CBB52DA8524384