使用 GPG 签名你的 Git Commit
众所周知,如果用 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 可能需要单独安装一下
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
然后终端中会有如下提示
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数发生器有更好的机会获得足够的熵
同时,会弹出一个界面要求你输入私匙密码并确定
然后密钥就已经生成完毕了。记下密钥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
。
将刚刚复制的 GPG 公钥粘贴到对话框中,点击 Add GPG ksy
(可能回要求你输入 GitHub 密码)
至此以后你在这台计算机使用 git pull
推送到 GitHub 的所有 commit 都带有 GPG 签名了