签名的Git推送

2020-11-06 18:08:40

很多人都知道可以对git对象进行pgp签名--比如标记或提交本身--但很少有人知道git提供的另一个认证功能,那就是签名git推送。

签署承诺是很棒的,但有一件事他们没有表明,那就是意图。例如,您可以编写一些危险的概念验证代码,并将其推送到refs/head/dangge-do-not-use中。您甚至可以将其推送到托管在完全不同的服务器上的其他分支中,以明确这不是可用于生产的代码。

但是,如果您的提交是PGP签名的,则有人可以拿走它们,并在存储库的任何其他分支中的任何其他分支上重播。对于任何检查提交签名的人来说,一切看起来都是完全合法的,因为实际的提交都是由你签名的--别管它们包含危险的易受攻击的代码,而且从来没有打算被推入Refs/Heads/Next之类的东西。至少,即使您只是在一个专门为实验设置的完全独立的环境中闲逛,您在推送坏代码时也会显得鲁莽。

为了帮助避免这个问题,Git为开发者提供了一种签署他们的实际推送的方式,作为一种方式来证明“是的,我确实打算把这些提交推到这个服务器上这个存储库中的这个引用中,这里是我的PGP签名来证明这一点。”当推送被签名时,Git会对照一个可信的钥匙环检查它收到的签名,并生成一个“推送证书”,该证书可以记录在类似于透明日志的东西上:

现在,在你急于启用签名推送之前,请记住,这一功能需要首先在服务器端启用,而绝大多数公共git托管伪装都没有启用这一功能。值得庆幸的是,git提供了if-asked设置,它将首先检查远程服务器是否支持签名推送,只有在远程服务器接受推送证书时才会生成推送证书。要自己启用此功能,只需在~/.gitconfig中添加以下内容:

如果您正在运行自己的GIT服务器,那么在服务器端启用它很容易。将以下内容添加到每个存储库配置文件,或添加到/etc/gitconfig以全局启用它:

您应该将certNonceSeed设置设置为某个随机生成的、应该保密的长字符串。它与时间戳结合以生成GIT客户端需要签名的一次性值(“nonce”),并提供一种机制来防止重放攻击并提供证书是为该特定服务器生成的证据(尽管对于其他人来说,要验证这一点,他们需要知道nonce种子的值)。

启用此功能后,您可以自行决定如何处理生成的证书。你可以简单地选择记录它们,就像我们对我们的透明日志所做的那样,或者你也可以实际上拒绝没有有效推送证书的推送。我建议您参考GIT文档和我们用来生成透明度日志的Post-Receive-Activity-Feed挂钩: