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)公钥服务器
为什么要签名后提交?
Git 通过提交信息中的 name
与 email
来识别用户,如果不使用签名,则拥有仓库权限的人可以冒用你的身份来提交代码。
- 可以用这个脚本:git-blame-someone-else 一键修改提交人信息
- 在这篇文章,作者分享了自己被冒用身份的过程:震惊!竟然有人在 GitHub 上冒充我的身份!
- 你也可以设置 linus torvalds 的邮箱提交代码,让众多知名人士为你的仓库贡献力量,以假乱真。
简单说,对提交进行签名能够证明这是你的提交,同时获得一个绿色认证标识。
签名验证流程
PGP 密钥分为 secret key
(私钥) 和 public key
(公钥),私钥必须妥善保管,公钥可以对外公开,拥有你公钥的人可以验证你用私钥签发的信息。
私钥签名,公钥验证,确认信息由你发布;公钥加密,私钥解密,用你公钥加密后的信息,只有你能用私钥解密查看。
验证流程
- PGP 密钥跟邮箱相关联。
- 将 GPG 生成的公钥添加到 Gitlab 等代码平台。
- 配置本地 Git 使用的用户名、邮箱、以及签名用的公钥指纹。
- Commit 时可通过参数开启签名(可设置为自动签名)。
- 提交的 Commit 信息会携带验证信息,当 Gitlab 通过你添加的公钥验证邮箱跟 Sign 匹配时,确认本地提交确实为你本人提交,显示
Verify
标识。 - 如果配置了他人的邮箱,但使用自己的 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。