使用 GPG 签名你的 Git Commit

6 min read

众所周知,如果用 GitHub 客户端或者在 GitHub 网页上操作 git 都会在 commits 中留下 Verified 的标记

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 可能需要单独安装一下

brew install gpg

生成 GPG 密钥

与 SSH 一样,GPG 采用的是非对称加密。

我们要想用 GPG 签名我们的 commit,首先需要一对 GPG 密钥。

如果没有的话,就使用以下命令生成一个 (按照提示输入姓名和邮箱地址):

$ gpg --gen-key
gpg (GnuPG) 2.2.15; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注意:使用 “gpg --full-generate-key” 以获得一个功能完整的密钥产生对话框。

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: mogeko
电子邮件地址: zhengjunyi@live.com

然后输入 o 以确定

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o

然后终端中会有如下提示

我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数发生器有更好的机会获得足够的熵

同时,会弹出一个界面要求你输入私匙密码并确定

Set Password

然后密钥就已经生成完毕了。记下密钥ID (就是形如 4089B828704223E7 的一串 16 进制数)

gpg: 密钥 4089B828704223E7 被标记为绝对信任
gpg: 吊销证书已被存储为‘/home/mogeko/.gnupg/openpgp-revocs.d/DC4E79EFEE5E224A20E9013A4089B828704223E7.rev’
公钥和私钥已经生成并被签名。

pub   rsa2048 2019-05-16 [SC] [有效至:2021-05-15]
      DC4E79EFEE5E224A20E9013A4089B828704223E7
uid                      mogeko <zhengjunyi@live.com>
sub   rsa2048 2019-05-16 [E] [有效至:2021-05-15]

设置 Git

首先设置一下 Git,让 Git 使用我们的密钥来对 commit 进行签名

git config --global user.signingkey <密钥ID>

然后设置 Git 全局使用该密钥加密 commit

git config --global commit.gpgsign true

顺便设置 Git 全局使用该密钥加密 tag

git config --global tag.forcesignannotated true

输出密钥

公钥文件 (.gnupg/pubring.gpg) 是以二进制的形式储存的,我们使用 --armor 参数将它转换成 ASCII 码的形式

gpg --armor --export <密钥ID>

复制输出的公钥信息

同样的,--export-secret-keys 则可以用来转换私匙,不过我们这里用不到 (千万不要把私匙透露给别人)

gpg --armor --export-secret-keys <密钥ID>

上传公钥至 GitHub

来到 GitHub 的设置页面的 SSH and GPG keys,点击 New GPG key

New GPG key

将刚刚复制的 GPG 公钥粘贴到对话框中,点击 Add GPG ksy (可能回要求你输入 GitHub 密码)

Add GPG key


至此以后你在这台计算机使用 git pull 推送到 GitHub 的所有 commit 都带有 GPG 签名了

Verified