2017-09-20 68 views
3

在专业版Git中,标记您的版本:我们是否应该共享用于检查签入git存储库的公钥?

它显示了一种将公钥集成到git中的方法,因此同步它的用户可以添加该公钥并验证签名标记。

这种方式实际上是否安全?有人可以改变公钥并重新签名。我认为我们应该从一个单独的授权方式获得公钥,对吧?

在这本书中的命令粘贴如下:

$ git tag -s v1.5 -m 'my signed 1.5 tag' 
You need a passphrase to unlock the secret key for 
user: "Scott Chacon <[email protected]>" 
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 <[email protected]> 
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 
+0

你为什么会接受公关更改公钥? – ceejayoz

+0

为什么你会接受恶意请求?这不是攻击模式:而是想到攻击者以某种方式获取存储库凭证并能够上传恶意提交(包括新密钥),而不发出请求。 –

+0

我认为(也许我错了)通过从分离和授权的方式获得可信的公钥来保证安全性,然后使用该密钥来验证签名标签,这也验证标签指向的提交以及承诺。因此无论我在哪里获取存储库,都会对其进行验证。根据您的意见,如果安全由授权的git服务器保证,为什么我们需要首先签署标签? – TangXC

回答

3

没有什么错在共享您的签名密钥,即使它当然不应该被视为一个有效的关键,除非通过其他方式验证。与完全不共享密钥相比,对方将不得不通过签名中包含的指纹参考从密钥服务器获取密钥 - 密钥仍然不可信,但是对密钥服务器有依赖性。

一个例子,为什么包括密钥可能显示有用:许多(企业)公司对服务器系统有非常严格的防火墙规则。您可能能够获得存储库服务器的许可(或者默认情况下甚至可以获得Github许可),但为关键服务器添加参考可能很乏味。在构建软件时,您可能很好地从存储库导入密钥 - 并根据硬编码的公钥指纹发布信任。尽管如此,这比静态地在本地存储密钥更好,例如滚动子密钥意味着破损的内部版本,除非本地密钥副本被更新。当从存储库中获取密钥(并通过公共主键指纹验证)时,不需要采取任何行动。

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

无论如何,也只是您提议的可靠来源上的关键字(或至少指纹,never use short key IDs)。通过具有可信证书的HTTP可用的网站是一个开始。特别是如果你进入开源项目,试着让你的密钥在开源会议上得到认证(或者至少有开发人员密钥认证,然后才能证明项目密钥)。

+0

谢谢你,感谢你的回答。但我仍然困惑于此。如果我们可以信任git仓库中的公钥,那么我们可以信任仓库中的标签,对吧?那么为什么我们需要首先签署标签? – TangXC

+0

那么,这正是我所讨论的:您可以提供密钥,但仍需要通过其他方式进行验证。例如,通过比较它的指纹(哈希码)与网站,...;运用“豆腐”信托模式;通过使用信任网。一旦密钥(或指纹)被验证,你就没事了。事实上,大多数OpenPGP生态圈依赖不可信的密钥交换方法(OpenPGP密钥服务器),但随后应用验证密钥的方法。 –

相关问题