为什么要数字签名

如果你不数字签名,任意一个人都可以伪造你的 Commit ,只需要在他的电脑上改一下自己的 Email 就完事儿了。非常危险。

file

了解 GPG 签名

需要使用 GPG 对 Git Commit 进行数字签名。

GPG签名是一种数字签名,用于证明某个电子文档或文件的真实性和完整性。GPG是GNU Privacy Guard的缩写,是一种开源的加密软件,可以用来创建和验证数字签名。GPG签名是通过将文件的哈希值与发送者的私钥进行加密来生成的,接收者可以使用发送者的公钥来验证签名,以确保文件未被篡改并确实由发送者发送。GPG签名通常用于保护敏感信息和确保电子文档的完整性。

下载并安装 GPG

如果使用的是 Linux 或 macOS,可以使用您的包管理器来安装。

如果您使用的是 Windows,则可以从 Gpg4win 官网下载安装程序;或安装 Git + GitBash 来安装。

生成一个 Key

开启GPG Sign非常简单。

首先生成一个Key:

gpg --gen-key

在上面的过程中,gpg 会询问你姓名和 Email,同时要求你设置一个密码。

获取我的 Key ID

完成后,您可以使用以下命令列出您的 GPG 密钥:

gpg --list-secret-keys --keyid-format LONG

这里需要找到刚刚生成的密钥的 ID。它通常是一个 8 位的十六进制字符串。

file

设置 Git Commit 使用这个 Key

使用命令来设置 GIt Commit 时使用的 Key:

git config --global user.signingkey $signKey

在上面的例子中,$signKey 应当是你刚刚复制的 Key ID。

你可能希望 Git 永远在 commit 时自动签名。执行下面的命令以开启默认自动签名:

git config --global commit.gpgsign true

好了,快去试试用你习惯的编辑器打一个 commit 吧。你会在 git log 中看到:

git log -1 --show-signature

file

让 GitHub、GitLab 信任你的公钥

显然,黑客也可以仿冒你的身份来完成上面步骤。只完成上面的步骤只是对 Commit 进行了签名,最终的安全保护,需要让平台信任你的签名(公钥),这样黑客只要摸不到你的私钥,就不会生成出被平台信任的 Commit 了。

为了完成这一步,需要将公钥添加到 GitHub 帐户中。您可以使用以下命令导出您的公钥:

gpg --armor --export $signKey

在上面的例子中,$signKey 应当是你刚刚复制的 Key ID。这将输出您的公钥,可以将其复制并粘贴到 GitHub\GitLab 帐户设置中的 GPG 密钥部分。

file

注意:公钥是完全应当公开并尽可能在更多地方展示的。不必担心它的泄露,反而你应当告诉你的好朋友:这是代表着你的公钥。

试试吧!

此时,你的 Git Commit 都会显示受信任的,而不再会被黑客仿冒。

file

跨设备同步你的 Key

我理解现在大家电子设备非常多。在每台自己的电脑上都去弄一遍这个 Key 非常繁琐。

比较简单的方法就是干脆把你的 GPG Key、 SSH Key 放进网盘。当然,这会带来安全风险:网盘的维护人将可以接触到你的 Key。同时一旦黑客攻陷了你的网盘,你的所有Commit都将可以被黑客伪造。(如果你的 Key 有密码保护,那么他也无法使用你的 Key)

如果你认为牺牲一点儿安全来换来方便是值得的,你可以来跨设备同步你的 Key。这里我使用 Nextcloud 来举例:

首先导出你的Key。这一步非常简单:

SIGNKEY=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | awk -F/ '{print $2}')
gpg --export-secret-keys $SIGNKEY > private.key

这会将你的Key导出为文件:private.key。将这个文件复制到你的网盘即可。

在 Nextcloud 中新建一个文件夹,放好你的 GPG Key 和 SSH Key。

file

对于新电脑来说,你可以运行下面的 Bash 来导入你的Key:(bash语法。对于Windows可能不能直接在PowerShell中运行)

# SSH Keys
echo "Setting SSH keys..."
mkdir ~/.ssh
cp -r ~/Nextcloud/Storage/SSH/* ~/.ssh/
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/id_rsa

# GPG Keys
echo "Setting GPG keys..."
sudo rm ~/.gnupg -rf
mkdir ~/.gnupg
gpg --import ~/Nextcloud/Storage/GPG/private.key
chmod 700 ~/.gnupg
SIGNKEY=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | awk -F/ '{print $2}')
git config --global user.signingkey $SIGNKEY
git config --global commit.gpgsign true

每次拿到新电脑,安装完 Nextcloud 后,跑一下上面的脚本,即可一键配置好 SSH 和 GPG 环境。之后像平时一样使用 SSH 和 Git 功能,就会无痛享受到安全方便啦!

注意:一定要避免黑客接触到你的GPG私钥!对网盘开启2FA、使用GPG的Password来提高安全性!

最后一步:喊你的朋友们!

当然,在你配置完 GPG 签名以后,最后,也就是最重要的一步:将你的公钥发给朋友,并告诉他们请信任这个公钥吧!不然……如果读者不知道如何正确验证签名,开了 GPG 跟没开也没什么区别。。。