我们是否应该共享 public 密钥以检查 git 存储库中的签名?

Should we share the public key for checking signing in the git repository?

在专业书 Git 中,标记您的发布:

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

这种方式真的安全吗?有人可以更改 public 密钥 blob 并重做 signing.I 认为我们应该从单独的授权方式获取 public 密钥,对吗?

书上命令粘贴如下:

$ 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

共享您的签名密钥并没有错,尽管它当然不应被视为经过验证的密钥,除非通过其他方式进行验证。与根本不共享密钥相比,另一方必须通过签名中包含的指纹引用从密钥服务器中获取它们——密钥仍然不可信,但对密钥服务器有依赖性。

举个例子,为什么包含密钥可能有用:许多(企业)公司对服务器系统都有非常严格的防火墙规则。您可能能够获得存储库服务器的许可(或者默认情况下甚至有 Github 许可),但是添加对关键服务器的引用可能很乏味。在构建软件时,您可能会从存储库中导入密钥——并根据 hard-coded public 密钥指纹发出信任。尽管如此,这仍然比在本地静态存储密钥要好,因为例如滚动子密钥意味着构建中断,除非更新本地密钥副本。从存储库中获取密钥(并通过 public 主键指纹验证)时,无需采取任何操作。

另外还有TOFU的概念:"trust on first use"。当您第一次获取密钥时(例如,在初始开发期间),您希望没有攻击者就位,但希望确保以后不会分发任何被操纵的源。开发人员在其本地开发机器上获取密钥并将其设置为受信任的可能已经很好,具体取决于您的攻击模型和可接受的风险。

无论如何,正如您所建议的,除了可信来源上的密钥(或至少指纹,never use short key IDs)。一个可通过 HTTPs 使用受信任证书的网站是一个开始。尤其是如果您参与开源项目,请尝试让您的密钥在开源会议上获得认证(或者至少让开发人员密钥获得认证,然后可以证明项目密钥)。