在了解到 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 上效果如下: