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

标签 git code-signing gnupg pgp openpgp

在《Pro Git, Tagging Your Releases》一书中:

它展示了一种将公钥收集到 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

最佳答案

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

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

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

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

关于git - 我们应该共享公钥以检查 git 存储库中的签名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46318599/

相关文章:

java - 如何自动将版本信息嵌入到我的 Java 应用程序中?

iphone - iPhone-发行证书问题

ios - 通过 Xcode 安装分发证书签名的 iOS 应用程序?

python gnupg 验证文件

linux - 使用脚本暴力破解 GPG 密码

GIT Pre-Commit Hook 更改文件但不添加提交

git - Jenkins 抛出错误 "Library expected to contain at least one of src or vars directories"

maven - 使用 gpg 验证签名后如何比较主 key 指纹?

java - Eclipse 错误导入项目

macos - Keychain 在运行 codesign 时总是要求输入密码