GPG:为你的 Git Commit 签名

Published: 2022-04-15

Tags: PGP

本文总阅读量

PGP 简介

PGP 是菲利普·齐莫尔曼开发地加密套件,后来因为大受欢迎并且流传广泛被标准化 —— 即 openPGP 标准,而 GPG 是兼容 openPGP 标准的 GNU 实现。

GnuPG 与 PGP 的关系

GnuPG 是 OpenPGP 协议的一种完备的实现,除了按照 OpenPGP 协议提供数据加解密和签名服务之外,它还提供了完整的秘钥管理功能,并实现了协议中许多可选的加密或压缩算法。

今天,“PGP”这个词几乎被普遍用来表示开放的 OpenPGP 标准,而不是最初的商业软件,因此“PGP”和“OpenPGP”是可以互换的。

“GnuPG”和“gpg”这两个词应该仅在提及工具时使用,而不用于它们产生的输出或它们实现的 OpenPGP 功能。举例:

PGP(而非 GnuPG 或 GPG)密钥 PGP(而非 GnuPG 或 GPG)签名 PGP(而非 GnuPG 或 GPG)公钥服务器

摘自:2021年,用更现代的方法使用PGP(上)

为什么要签名后提交?

Git 通过提交信息中的 nameemail 来识别用户,如果不使用签名,则拥有仓库权限的人可以冒用你的身份来提交代码。

简单说,对提交进行签名能够证明这是你的提交,同时获得一个绿色认证标识。

签名验证流程

PGP 密钥分为 secret key(私钥) 和 public key(公钥),私钥必须妥善保管,公钥可以对外公开,拥有你公钥的人可以验证你用私钥签发的信息。

私钥签名,公钥验证,确认信息由你发布;公钥加密,私钥解密,用你公钥加密后的信息,只有你能用私钥解密查看。

验证流程

  1. PGP 密钥跟邮箱相关联。
  2. 将 GPG 生成的公钥添加到 Gitlab 等代码平台。
  3. 配置本地 Git 使用的用户名、邮箱、以及签名用的公钥指纹。
  4. Commit 时可通过参数开启签名(可设置为自动签名)。
  5. 提交的 Commit 信息会携带验证信息,当 Gitlab 通过你添加的公钥验证邮箱跟 Sign 匹配时,确认本地提交确实为你本人提交,显示 Verify 标识。
  6. 如果配置了他人的邮箱,但使用自己的 SignKey,那么提交会被显示为 Unverified 未识别状态。

接来下进入实际操作,为 Commit 签名。

为 Commit 添加签名

生成 PGP 密钥

可以通过命令行生成,推荐使用 GPG Tools 工具。

导出公钥添加到 Gitlab

查看公钥

$ gpg --list-keys

导出公钥

$ gpg --armor --export <Fingerprint>

到用户 GPG 配置面板添加公钥。

添加后会显示米的公钥指纹。

另外,通过域名用户名的路径,后缀为.gpg 的网址可查看到用户公钥。(示例路径:https://gitlab.com/dong.gpg)

配置 Git 启用签名

子密钥:一般在使用密钥时会创建子密钥使用,之前导出的公钥已经包含了主密钥及子密钥的指纹信息,换句话说,在配置 Git 时使用子密钥的指纹也是可以的。

这是一个子密钥的指纹

指纹总长度 40 位,使用3E7CEE6F0E7FD086(16位)、0E7FD086(8位) 都代表个这个密钥。

为当前项目指定密钥

git config user.signingkey 3E7CEE6F0E7FD086

设置 Git 自动签名

git config commit.gpgsign true

后续提交的代码,在 Gitlab 上会显示 Verify 标识。

特别的,如果你不需要自动签名,那么可以在提交时使用 -s 参数启用签名。

git commit -s -m "add ..."

查看 Commit 信息

从提交记录可以看到带签名的提交记录会显示 GPG 摘要信息。

git log --show-signature
commit 85624224009a71c3ded5fb1353d535ba85210742
gpg: 签名建立于 三  4/ 6 19:09:45 2022 CST
gpg:               使用 RSA 密钥 7376E8AF19772CA4BE919661EFB6C2EA6D06CCFF
gpg: 完好的签名,来自于 “dong (Orz) <dong@some.com>” [绝对]
Author: dong <dong@some.com>
Date:   Wed Apr 6 19:09:45 2022 +0800

    add 2.txt

commit b6463db236b4953de7ddb1fea41ff3f6dbf7c2fc
Author: dong <dong@some.com>
Date:   Wed Apr 6 19:03:36 2022 +0800

    add 1.txt

使用 git cat-file 命令可以查看详尽的提交内容

git cat-file -p <commit-sha>

带签名的提交

Gitlab 通过这些信息验证这是本人提交,并显示 Verified。

参考

  1. WIKI - PGP
  2. 2021年-用更现代的方法使用PGP-上