我们应该在git存储库中共享用于检查签名的公钥吗?

我们应该在git存储库中共享用于检查签名的公钥吗?,git,code-signing,gnupg,pgp,openpgp,Git,Code Signing,Gnupg,Pgp,Openpgp,在Pro Git一书中,标记您的发布: 它展示了一种在git中将公钥收集到blob中的方法,以便同步该公钥的用户可以添加该公钥并验证签名的标记 这条路真的安全吗?有人可以更改公钥blob并重新签名。我认为我们应该从一个单独的授权方式获取公钥,对吗 书中的命令粘贴如下: $ git tag -s v1.5 -m 'my signed 1.5 tag' You need a passphrase to unlock the secret key for user: "Scott Chacon <

在Pro Git一书中,标记您的发布:

它展示了一种在git中将公钥收集到blob中的方法,以便同步该公钥的用户可以添加该公钥并验证签名的标记

这条路真的安全吗?有人可以更改公钥blob并重新签名。我认为我们应该从一个单独的授权方式获取公钥,对吗

书中的命令粘贴如下:

$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scott Chacon <schacon@gmail.com>"
1024-bit DSA key, ID F721C45A, created 2009-02-09

$ gpg --list-keys
/Users/schacon/.gnupg/pubring.gpg
---------------------------------
pub   1024D/F721C45A 2009-02-09 [expires: 2010-02-09]
uid                  Scott Chacon <schacon@gmail.com>
sub   2048g/45D02282 2009-02-09 [expires: 2010-02-09]

$ gpg -a --export F721C45A | git hash-object -w --stdin
659ef797d181633c87ec71ac3f9ba29fe5775b92

$ git tag -a maintainer-pgp-pub 659ef797d181633c87ec71ac3f9ba29fe5775b92

$ git show maintainer-pgp-pub | gpg --import
$git tag-s v1.5-m'my signed 1.5 tag'
您需要密码短语来解锁的密钥
用户:“Scott Chacon”
1024位DSA密钥,ID F721C45A,创建于2009-02-09
$gpg—列出密钥
/Users/schacon/.gnupg/pubring.gpg
---------------------------------
pub 1024D/F721C45A 2009-02-09[到期日期:2010-02-09]
史考特·查孔
sub 2048g/45D02282 2009-02-09[到期日期:2010-02-09]
$gpg-a--导出F721C45A | git哈希对象-w--stdin
659ef797d181633c87ec71ac3f9ba29fe5775b92
$git标签-维护者pgp发布号659ef797d181633c87ec71ac3f9ba29fe5775b92
$git show mainter pgp pub | gpg--导入

共享您的签名密钥没有错,即使它当然不应该被视为已验证密钥,除非通过其他方式验证。与根本不共享密钥相比,另一方必须通过签名中包含的指纹引用从密钥服务器获取密钥——密钥仍然不受信任,但依赖于密钥服务器

例如,为什么包含密钥可能会很有用:许多(企业)公司对服务器系统有非常严格的防火墙规则。您可能能够获得存储库服务器的许可(或者在默认情况下甚至有Github许可),但是为关键服务器添加引用可能会很乏味。在构建软件时,您可能会从存储库导入密钥,并基于硬编码的公钥指纹发出信任。不过,这比静态地将密钥存储在本地要好,例如滚动子密钥意味着除非本地密钥副本被更新,否则构建将被破坏。从存储库获取密钥(并通过公钥指纹验证)时,无需执行任何操作

此外,还有豆腐的概念:“相信第一次使用”。当您第一次获取密钥时(例如,在初始开发期间),您希望没有攻击者在场,但希望确保以后不会分发任何被操纵的源。开发人员在其本地开发机器上获取密钥并将其设置为受信任可能已经很好了,这取决于您的攻击模型和可接受的风险


不管怎么说,也要像你建议的那样,在可信源上使用密钥(或者至少是指纹)。一个可以通过HTTPs使用可信证书访问的网站就是一个开始。特别是如果您正在从事开源项目,请尝试在开源会议上认证您的密钥(或者至少认证开发人员密钥,这样可以认证项目密钥)。

为什么您会接受更改公钥的PR?为什么您会接受恶意拉取请求?这不是攻击模型:而是考虑攻击者以某种方式获得存储库凭据,能够上传恶意提交,包括新密钥,而不发出拉请求。我认为(可能我错了)通过从分离和授权的方式获取可信公钥来保证安全性,然后使用该键验证已签名的标记,这还验证标记指向的提交以及提交中的所有内容。因此,无论我在哪里获得存储库,这都会验证它。根据您的评论,如果安全是由授权的git服务器保证的,那么为什么我们首先需要签署标签?我并没有声称git服务器必须经过授权;必须有一些额外的方法来发布信任(尽管有不同的方法,只要告诉“好吧,这是我第一次看到的密钥,应该可以,但用于签署代码的密钥不应该更改”就可以了)。谢谢你,感谢你的回答。但我还是很困惑。如果我们可以信任git存储库中的公钥,那么我们就可以信任存储库中的标记,对吗?那为什么我们首先需要在标签上签名呢?好吧,这正是我所讨论的:你可以提供密钥,但它仍然需要通过其他方式进行验证。例如,通过将其指纹(哈希值)与网站进行比较。。。;运用“豆腐”信任模型;通过使用信任网。一旦确认了钥匙(或指纹),你就没事了。事实上,大多数OpenPGP ecosphere依赖于不受信任的密钥交换方法(OpenPGP密钥服务器),但随后应用了验证密钥的方法。