GPG 签名是对代码提交者进行身份验证的一种补充,即证明代码提交来密钥持有者,理论上可以确保在目前的破译技术水平下无法篡改内容。您可以使用 GPG 工具 (GNU Privacy Guard) 生成密钥,对 Git 仓库中所做的提交进行签名。
Gitea 服务器在检查代码签名时利用用户提供的 GPG 公钥验证代码提交者的身份。如果希望强制启用签名,您可以为您的项目配置分支保护规则,拒绝未使用 GPG 签名的提交,或拒绝来自未验证用户的提交。
GnuPG 实现不同于 OpenPGP,本文使用 GPG 来指代所有 OpenPGP、PGP 和 GPG 相关的工具。
在使用 GPG 签名代码前,需要考虑以下问题:
- 提交者必须具有 GPG 密钥对,即公钥和私钥。公钥支持公开分享,私钥不得分享并且必须加密保存。
- 提交者的公钥必须上传到他们的 Gitea 帐户
- 提交者的电子邮件地址应当与 GPG 密钥中的电子邮件地址相匹配。
- GPG 公钥中的其中一个电子邮件地址应当与 Gitea 账号中已验证的电子邮件地址匹配
- 如果要隐藏提交者真实的电子邮件地址,请在 GPG 密钥和 Git 签名中使用 Gitea 自动生成的隐藏电子邮件域,例如
[email protected]
- GPG 密钥有四种用途,分别是 签名(S)、加密(E)、认证(A)、授权(C)。这里仅做签名使用。
由于 Gitea 使用自己数据库中的的密钥环来验证 GPG 签名,因此它不依赖任何第三方公钥服务器。
查看任意 Gitea 用户的 GPG 公钥
要查看 Gitea 用户的 GPG 公钥,您可以:
- 访问
https://gitea.com/<USERNAME>.gpg
- 如果用户配置了 GPG 密钥,将显示完整的 GPG 公钥链
- 没有配置 GPG 密钥的用户将显示
Note: This user hasn't uploaded any GPG keys.
- 转到用户的账户设置(例如
https://gitea.com/user/settings/keys
)。在账户设置的顶部导航栏,选择 SSH / GPG 密钥。
配置提交签名
要签名提交,您必须同时配置本地计算机和 Gitea 帐户:
- 创建 GPG 密钥对
- 将 GPG 公钥添加到您的帐户
- 将您的 GPG 密钥与 Git 关联
- 签名您的 Git 提交
创建 GPG 密钥
如果您还没有 GPG 密钥,请创建:
1.根据您的操作系统安装 GnuPG工具。
2.生成您的密钥对:
# 使用基础的密钥生成向导,可以选择产生 RSA\DSA 密钥对
gpg --full-generate-key
# 或则,使用专家模式,可以选择更多密钥算法,例如 ECC(本文推荐)
gpg --full-generate-key --expert
3.选择密钥一个密钥算法,输入对应的数字序号并按 Enter 键确认选项。这里我们选择了 (9) ECC and ECC
。
4.选择椭圆曲线(elliptic curve)算法时建议选用 (1) Curve 25519
。
5.指定密钥的有效期限。有效期限属于君子协议,是为了确保密钥在公共密钥服务器上可维护性,这里我们使用默认值 0
表示永不过期。
6.确认之前的所有配置,请输入 y
。
7.输入您的姓名。
8.输入您的电子邮件地址。这里的邮箱地址必须与 Gitea 帐户中的 已验证电子邮件地址 匹配。
9.可选。输入密钥评论信息,此信息会显示在密钥联系人姓名旁的括号中。
10.最后 GPG 生成向导将显示您之前输入的信息。根据提示重新编辑信息或按 O(表示 Okay
)继续。
11.输入强密码,并且再次输入确认。此密码用于加密 GPG 私钥。
12.列出 公钥 ID,请运行命令 gpg -k
,列出 私钥 ID,请运行命令 gpg -K
。我们发现同一个密钥对的私钥和公钥 ID 是一样的。
13.在输出中,找到 pub/sec
所在的段落,并复制 GPG 密钥 ID。例如 F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7
:
$ gpg -k
/home/user/.gnupg/pubring.kbx
------------------------------
pub ed25519 2022-12-30 [SC]
F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7
uid [ultimate] Gitea User (Test) <[email protected]>
sub cv25519 2022-12-30 [E]
14.要导出公钥,请运行以下命令,将 <ID>
替换为上一步中的 GPG 密钥 ID 或者 邮件地址:
gpg --armor --export <ID>
15.复制公钥时,应当包含 -----BEGIN PGP PUBLIC KEY BLOCK-----
和 -----END PGP PUBLIC KEY BLOCK-----
以及其中的所有字段。
将 GPG 密钥添加到您的帐户
将 GPG 密钥添加到您的帐户:
- 登录 Gitea。
- 在右上角,选择您的头像。
- 选择 设置。
- 在顶部导航栏,选择 SSH / GPG 密钥。
- 在 增加密钥 中,粘贴您的 公钥。
- 要将密钥添加到您的帐户,请选择 添加密钥。Gitea 显示密钥的指纹、电子邮件地址和创建日期:
添加密钥成功后,您将无法再次对其进行编辑。您可以删除已有的密钥并重新添加它。如果公钥中的邮箱地址与账户绑定的邮箱地址不匹配,您仍然可以将其添加到 Gitea 公钥链中,但在启用该密钥前需要使用您的私钥进行二次验证,以确认密钥的所有权。
将您的 GPG 密钥与 Git 关联
创建 GPG 密钥并将其添加到您的 Gitea 帐户后,您可以配置 Git 并在提交代码时使用此密钥:
1.运行命令 gpg -k
列出您刚刚创建的 GPG 密钥的 ID。
2.复制以 pub/sec
开头的 GPG 密钥 ID。在本例中,密钥 ID 为 F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7
:
$ gpg -k
/home/user/.gnupg/pubring.kbx
------------------------------
pub ed25519 2022-12-30 [SC]
F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7
uid [ultimate] Gitea User (Test) <[email protected]>
sub cv25519 2022-12-30 [E]
2.运行下面的命令配置 Git 以使用您指定的密钥签名您的提交,将 <KEY ID>
替换为您的 GPG 密钥 ID:
git config --global user.signingkey <KEY ID>
签名您的 Git 提交
将公钥添加到您的帐户后,您可以手动签名单个提交,或将 Git 配置为默认为所有提交签名:
- 添加
GPG_TTY
添加到本地系统用户的 Bash 环境变量
[ -f ~/.bashrc ] && echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
-
手动签名单个 Git 提交:
-
将
-S
标志添加到您要签名的任何提交:git commit -S -m "first commit"
-
签名时会弹出提示框。询问 GPG 密钥的密码。
-
-
(可选)对所有 Git 提交进行签名:
git config --global commit.gpgsign true
验证提交
您可以查看合并请求或整个项目的提交:
-
查看项目的提交:选择 仓库 > 提交。
-
查看合并请求的提交:选择 仓库 > 合并请求,然后选择其中一个合并请求,检查代码提交记录。
-
确定您要查看的提交。根据 GPG 签名的验证状态,已签名的提交会显示 绿锁 、黄锁 或 灰锁 徽章。未签名的提交不显示徽章:
-
要显示提交的签名详细信息,请选择 GPG 签名徽章:
吊销和删除 GPG 密钥
如果 GPG 密钥被泄露,请即使吊销并从服务器删除密钥。删除密钥后会对之前基于此密钥的提交造成影响,具体表现为:经过此密钥签名的提交被标记为未验证。
要从您的帐户中删除 GPG 密钥:
- 在右上角,选择您的头像。
- 选择 设置。
- 在顶部导航栏,选择 SSH / GPG 密钥。
- 点击要删除的 GPG 密钥旁边的 删除 按钮。