众所周知,如果用 GitHub 客户端或者在 GitHub 网页上操作 git 都会在 commits 中留下 Verified
的标记
这表示该 commit 是在 GitHub 上创建的,使用 GitHub 的 key 对这个提交进行了签名。
但 GitHub 客户端或者 GitHub 网页并不是签名 commit 的唯一方法,我们也可以通过 GnuPG (GPG) 来签名我们的 commit。
GPG 是一个非常出色的加密软件,当年斯诺登为了安全的将绝密文件交给记者,就用 GPG 对文件进行了加密。
通过 GPG 签名 commit 不仅可以获得 Verified
的标识,更重要的是它能够有效的提高该 Git 仓库的安全性 (GPG 签名并不能提高开源软件本身的安全性)。因为它可以证明这个 commit 是通过你信任的的电脑提交的,而不是某个冒用你名号的黑客。这相当于赋予了 commit 一种不可更改性,即使黑客通过某种办法拿到了 Git 仓库的读写权,他也没有办法添加或者使用 --force
修改任何带有你 GPG 签名的 commit。
安装 GPG
一般的 GNU/Linux 都是自带得有 GPG,直接用就可以了。
Windows 版的 GPG 包含在 MinGW 或者中,而 Windows 版的 Git 基于 MinGW,所以说安装了 Git 就相当于安装了 GPG,可以直接在 Git Bash 中使用。
macOS 可能需要单独安装一下
|
|
生成 GPG 密钥
与 SSH 一样,GPG 采用的是非对称加密。
我们要想用 GPG 签名我们的 commit,首先需要一对 GPG 密钥。
如果没有的话,就使用以下命令生成一个 (按照提示输入姓名和邮箱地址):
|
|
然后输入 o
以确定
|
|
然后终端中会有如下提示
|
|
同时,会弹出一个界面要求你输入私匙密码并确定
然后密钥就已经生成完毕了。记下密钥ID (就是形如 4089B828704223E7 的一串 16 进制数)
|
|
设置 Git
首先设置一下 Git,让 Git 使用我们的密钥来对 commit 进行签名
|
|
然后设置 Git 全局使用该密钥加密 commit
|
|
顺便设置 Git 全局使用该密钥加密 tag
|
|
输出密钥
公钥文件 (.gnupg/pubring.gpg) 是以二进制的形式储存的,我们使用 --armor
参数将它转换成 ASCII 码的形式
|
|
复制输出的公钥信息
同样的,--export-secret-keys
则可以用来转换私匙,不过我们这里用不到 (千万不要把私匙透露给别人)
|
|
上传公钥至 GitHub
来到 GitHub 的设置页面的 SSH and GPG keys,点击 New GPG key
。
将刚刚复制的 GPG 公钥粘贴到对话框中,点击 Add GPG ksy
(可能回要求你输入 GitHub 密码)
至此以后你在这台计算机使用 git pull
推送到 GitHub 的所有 commit 都带有 GPG 签名了