如何自动验证所有提交者PGP签署其提交

5

Github支持使用PGP密钥对提交进行签名。

我们有一个开源项目,接受没有PGP密钥的人的贡献。安全对我们至关重要,因此我们决定每个合并拉取请求的人都将使用自己的PGP密钥签署合并请求,因此每个实际提交将直接由作者和/或合并方直接签署。

如何设置持续集成构建来确保这确实发生?如果任何人在没有用给定的授权密钥之一对代码进行签名的情况下提交或合并代码到主存储库中,则我们希望构建失败,警报响起,并可能撤销提交/合并。

我们正在使用Github,所以我想知道是否可以使用Github Hooks来帮助。我认为我们正在使用Jenkins进行CI,但是这可能无关紧要,因为它将是一个自定义脚本。

澄清一下: 该项目接受来自开源开发者的贡献,我们不需要每个人都有PGP密钥。但是,在github上具有合并权限的每个人必须拥有PGP密钥,并且我提议的构建将验证此密钥。即使不是每个提交都进行签名,合并提交本身也将进行PGP签名。


在开始使用 Git 之前,http://mikegerwitz.com/papers/git-horror-story 是一篇重要的阅读材料。然后,请参考:http://stackoverflow.com/a/10302253/6309。 - VonC
1个回答

5

更新(2021年4月):

请参见 "使用警戒模式标记未签名提交":

为了提高安全性和对您的贡献的真实性的信心,您可以在 GitHub.com 上标记归属于您但未由您签名的提交和标签。启用警惕模式(现在可用于测试版),将标记未经您签名的归属于您的提交,并显示未验证徽章。这可以提醒您和其他人注意可能存在的真实性问题。Git 提交的作者和提交者很容易被欺骗。例如,有人可以推送一个声称来自您的提交,但实际上不是。就像展示护照一样,提交者可以通过使用 GPG 或 S/MIME 密钥对其进行签名,从而增加对其提交的信任。现在,当您启用警惕模式时,如果提交归属于您但未由您签名,则会被标记。如果有人试图欺骗您的身份作为提交者或作者,则会引起注意。启用警惕模式后,您的所有提交和标签都将标有三种验证状态之一:已验证、部分验证或未验证。尝试一下吧!首先,请查看如何自动签署您的提交。然后,在您的帐户设置中启用警惕模式。请确保在开始签署您的提交和标签后启用警惕模式。一旦启用,您推送到 GitHub.com 的任何未签名提交或标签都将被标记为“未验证”,包括过去的提交。了解更多关于警惕模式的信息。

更新(2016年4月)

请参见 "GitHub GPG 签名验证":

从今天开始,GitHub将显示提交和标签是否已签名。

https://cloud.githubusercontent.com/assets/25792/14253743/87b504be-fa41-11e5-9140-6dc8b7203c31.png

查看已签名的提交或标签时,您将看到一个徽章,指示是否使用任何贡献者上传到GitHub的GPG密钥验证了签名。
您可以访问密钥设置页面上传您的GPG密钥。

https://cloud.githubusercontent.com/assets/25792/14290042/5b27dab2-fb12-11e5-9ff9-44116a7780ea.png


原始答案(2014年6月)

从您的编辑中,您选择了论文“A Git Horror Story: Repository Integrity With Signed Commits”中的第二个选项:

选项#2就是在git merge命令中传递-S参数。
如果合并是快进的(也就是说,所有提交都可以简单地应用于HEAD之上,而不需要合并),那么您需要使用--no-ff选项来强制合并提交。

然后,制作a signed request-pull(如果commit.gpgsign设置则始终可以签名)可以将签名部分限制为仅作为贡献提交合并的提交(而不是任意两个分支之间的随机合并)。

有关该过程的更多细节,请参见:

因此,如果您的持续集成构建仅合并 request-pull(在this test script中使用),则可以检查这些特定提交是否已签名(如果没有签名,则不要合并它们)。
此脚本是这样一个检查的示例:"check-commit-signature"。

谢谢。哇,好久没在这里问问题了...也没写代码。 - ripper234
不要忘记在Git 2.23中使用git config tag.gpgSign true来签署标签。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接