使用GPG对Git Commit进行签名

使用GPG可以对我们的每一个Git Commit进行签名,通过签名,会在commit的记录上显示一个 Verified 的标记,它表示这次提交是确实是出自你自己,而不是冒用你帐号的人。目前GitHub和GitLab均已经支持此功能。

https://xiaozhou.net/pics/gpg/1.png

通过GPG签名的Git Commit更加可信,就算你的SSH private key泄漏,别人也没办法仿冒你的身份对Git Commit进行签名,或者更改你已经签名的Git Commit。

安装GPG

Mac OS下安装GPG,可以直接用 homebrew:

1
brew install gpg

生成GPG密钥

跟SSH的Key一样,GPG也是采用非对称加密方式。生成一对GPG密钥,我们需要使用命令:

1
gpg --full-generate-key

生成类似SSH Key,需要你输入用户名,邮箱,或者是密钥的保护密码。生成完成后,我们可以通过如下命令,查看系统中已经生成的GPG Key:

1
gpg -K

系统中的每对GPG key,均有一串类似十六进制的Key ID。由于我的系统中已经有两对GPG Key,所以看起来是这样的:

https://xiaozhou.net/pics/gpg/2.png

提交公钥到GitHub

GitHub的帐号设置中,有专门添加SSH Key和GPG Key的地方,GitLab也类似。首先,我们应当使用命令把GPG Key的公钥导出和显示出来:

1
gpg --armor --export <Key ID>

https://xiaozhou.net/pics/gpg/4.png

接着,我们需要把 BEGINEND 之间的内容复制,添加到GitHub,成功之后,GitHub就能显示我们的GPG Key了:

https://xiaozhou.net/pics/gpg/3.png

本地Git设置

接下来,我们需要设置本地的Git:

1
2
3
git config --global user.signingkey <Key ID>
git config --global commit.gpgsign true
git config --global gpg.program gpg

上面命令的目地,是设置在Git Commit签名的时候所用到的Key,并全局开启GPG签名,然后还指定了签名使用用到的程序 pgp。如果你使用SKM,你需要在对应SSH Key的目录中,创建一个HOOK 文件,然后复制上面的命令,这样,在切换SSH Key的时候,也能自动生效设置了。

最后,就是验证提交和测试了,如果一切进展顺利,你就能在GitHub或者GitLab的提交上,看到右边绿色的 Verified 标记了。

很幸运的是,Emacs的Git插件magit 也完美支持GPG签名功能,这样在Emacs中提交的时候,也可以直接用GPG签名了,nice!

https://xiaozhou.net/pics/gpg/5.png

支持原创技术分享,据说打赏我的人,都找到了女朋友!