GPG 签名提交
您可以使用 GPG 密钥对在极狐GitLab 仓库中进行的 Git 提交进行签名。如果可以验证提交者的身份,则签名提交将标记为 已验证。为了验证提交者的身份,极狐GitLab 需要他们的公共 GPG 密钥。
要查看用户的公共 GPG 密钥,您可以:
- 转到
https://gitlab.example.com/<username>.gpg
。 - 选择用户个人资料右上角的 查看公共 GPG 密钥 ()。
尚不支持 GPG 验证标签。
如何处理 GPG
极狐GitLab 使用自己的密钥环来验证 GPG 签名。它不访问任何公钥服务器。
对于要由极狐GitLab 验证的提交:
- 提交者必须有一个 GPG 公钥/私钥对。
- 提交者的公钥必须已上传到他们的极狐GitLab 帐户。
- GPG 密钥中的电子邮件之一必须与极狐GitLab 中提交者使用的已验证电子邮件地址匹配。该地址将成为公钥的一部分。如果您想将此地址保密,请使用极狐GitLab 在您的个人资料中提供的自动生成的私人提交电子邮件地址。
- 提交者的电子邮件地址必须与 GPG 密钥中经过验证的电子邮件地址相匹配。
生成 GPG 密钥
如果您还没有 GPG 密钥,以下步骤可以帮助您入门:
-
安装 GPG,适用于您的操作系统。如果您的操作系统安装了
gpg2
,请在以下命令中将gpg
替换为gpg2
。 -
使用适合您的
gpg
版本的命令生成私钥/公钥对。这个命令会产生一系列问题:# Use this command for the default version of gpg, including # Gpg4win on Windows, and most macOS versions: gpg --gen-key # Use this command for versions of GPG later than 2.1.17: gpg --full-gen-key
-
第一个问题是可以使用哪种算法。选择您想要的种类或按 Enter 选择默认值(RSA 和 RSA):
Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1
-
下一个问题是密钥长度。我们建议您选择
4096
:RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits
-
指定您的密钥的有效期。 这是主观的,您可以使用默认值,即永不过期:
Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 0 Key does not expire at all
-
输入
y
确认您给出的答案是正确的:Is this correct? (y/N) y
-
输入您的真实姓名、与此密钥关联的电子邮件地址(应与您在极狐GitLab 中使用的已验证电子邮件地址匹配)和可选评论(按 Enter 跳过):
GnuPG needs to construct a user ID to identify your key. Real name: Mr. Robot Email address: <your_email> Comment: You selected this USER-ID: "Mr. Robot <your_email>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
- 询问时选择一个强密码并输入两次以确认。
-
使用以下命令列出您刚刚创建的私有 GPG 密钥:
gpg --list-secret-keys --keyid-format LONG <your_email>
将
<your_email>
替换为您在上面输入的电子邮件地址。 -
复制以
sec
开头的 GPG 密钥 ID。 在以下示例中是30F2B65B9246B6CA
:sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC] D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA uid [ultimate] Mr. Robot <your_email> ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
-
导出该 ID 的公钥(替换上一步中的密钥 ID):
gpg --armor --export 30F2B65B9246B6CA
- 最后,复制公钥并在您的用户设置中添加
添加 GPG 密钥到您的帐户
您可以在用户设置中添加 GPG 密钥:
- 在右上角,选择您的头像。
- 选择 编辑个人资料。
- 在左侧边栏上,选择 GPG 密钥。
-
将您的公钥粘贴到 密钥 文本框中。
-
选择 添加密钥 将其添加到极狐GitLab。您可以看到密钥的指纹、相应的电子邮件地址和创建日期。
将您的 GPG 密钥与 Git 相关联
在您创建您的 GPG 密钥并将其添加到您的帐户之后,是时候告诉 Git 使用哪个密钥了。
-
使用以下命令列出您刚刚创建的私有 GPG 密钥:
gpg --list-secret-keys --keyid-format LONG <your_email>
将
<your_email>
替换为您在上面输入的电子邮件地址。 -
复制以
sec
开头的 GPG 密钥 ID。在下面的例子中,它是30F2B65B9246B6CA
:sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC] D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA uid [ultimate] Mr. Robot <your_email> ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
-
告诉 Git 使用该密钥对提交进行签名:
git config --global user.signingkey 30F2B65B9246B6CA
将
30F2B65B9246B6CA
替换为您的 GPG 密钥 ID。 -
(可选)如果 Git 正在使用
gpg
并且您得到类似secret key not available
或gpg: signature failed: secret key not available
的错误,运行以下命令以更改为gpg2
:git config --global gpg.program gpg2
签名提交
在您创建您的 GPG 密钥并将其添加到您的帐户 后,您可以开始签名您的提交:
-
像以前一样提交,唯一的区别是添加了
-S
标志:git commit -S -m "My commit msg"
- 询问时输入 GPG 密钥的密码。
- 推送到极狐GitLab 并检查您的提交已验证。
如果你不想在每次提交时都输入 -S
标志,您可以告诉 Git 自动签名您的提交:
git config --global commit.gpgsign true
验证提交
-
在项目或 合并请求 中,导航到 提交 选项卡。签名提交显示一个包含 已验证 或 未验证 的徽章,具体取决于 GPG 签名的验证状态。
-
通过单击 GPG 徽章,将显示签名的详细信息。
撤销 GPG 密钥
撤销密钥取消验证已经签名的提交。使用此密钥验证的提交更改为未验证状态。撤销此密钥后,未来的提交将保持未验证。如果您的密钥已被泄露,则应使用此操作。
要撤销 GPG 密钥:
- 在右上角,选择您的头像。
- 选择 编辑个人资料。
- 在左侧边栏上,选择 GPG 密钥。
- 选择要删除的 GPG 密钥旁边的撤销。
删除 GPG 密钥
删除密钥不会取消验证已经签名的提交。使用此密钥验证的提交保持验证状态。删除此密钥后,只有未推送的提交保持未验证状态。 要取消验证已签名的提交,您需要从您的帐户中撤销关联的 GPG 密钥。
要从您的帐户中删除 GPG 密钥:
- 在右上角,选择您的头像。
- 选择 编辑个人资料。
- 在左侧边栏上,选择 GPG 密钥。
- 选择要删除的 GPG 密钥旁边的垃圾桶图标 ()。
拒绝未签名的提交
您可以将您的项目配置为,通过推送规则拒绝非 GPG 签名的提交。