在了解到 github 及码云对 GPG 签名的支持后,我十分推荐对 git 的提交进行 GPG签名。
场景
熟悉 git 的人会知道 git blame 这个命令,可以用于查看某一行代码是由谁改动的,它大有用处,比如:
- 之前写过的《统计项目中的代码有多少行是你贡献的》就是基于这个命令来实现的。
- 当项目有 bug 时,可以通过这个命令追查是由谁引入的。
但是 commit 的作者是可以进行伪造的。比如通过 git config user.name 及 git config user.email 配置成其他人的名字及邮箱,然后再提交。甚至通过 git rebase 及 git commit --amend --author="$AUTHOR" 来修改历史,伪造其他人的提交,github 上就有这种操作的实现项目: jayphelps/git-blame-someone-else。
使用 GPG 签名防止伪造
以上可知,git commit 的作者信息是可以轻易伪造的,所以我们可以使用 GPG 对其进行签名,避免他人伪造。关于 GPG 的安装及使用,这里略过不谈,可参考我前一篇博客《Mac 下使用 GPG 加密邮件》提到的参考文章,以下主要讲 Git 及 Github 和码云上的配置。
Git 配置
不知道是不是所安装的 GPG 工具版本的问题,我在命令行下运行 gpg -k,所列出的信息并不包含 GPG key ID,所以我还是打开了 GPG Keychain。双击自己的密钥,可以看到自己的密钥标识,如下:
把它复制出来,在命令行配置签名的 key,命令如下:
1 | git config --global user.signingkey 上面复制的密钥标识` |
然后开启 commit 的 GPG 签名:
1 | git config commit.gpgsign true |
配置 Github 及码云
首先需要获取公钥,我们可以通过命令 gpg --armor --export 密钥标识 输出,也可以在 GPG Keychain 导出公钥,然后把它们复制出来。
进入 Github 上的个人设置,在 SSH and GPG keys 面板上新增 GPG key,把公钥内容复制上去并添加。这就完成了。需要注意的是,如果你的 GPG key 邮箱不是通过 Github 上验证的邮箱的话,需要在个人设置的 Emails 那里对邮箱进行验证,否则即使对 commit 签了名,还是会提示 unverified。
码云上的设置同理,进入个人设置界面,在安全设置的 GPG 公钥面板进行添加。
效果
最后,我们提交一下代码,第一次签名时会提出输入密码,输入并保存之后,把代码推上去,Github 上效果如下: