最新:获取项目更新在TwitterMastodon

签名密钥

此页面介绍了密钥的引导过程,包括如何执行引导过程以及为什么需要引导过程。

我们提供什么?

为了便于验证签名,我们直接从 cert-manager 网站提供公钥信息。重要的是,要从与工件托管位置不同的位置提供密钥;如果密钥与工件托管在同一位置,攻击者能够更改工件,也能够更改密钥!

我们在 static/public-keys 下提供多种密钥类型

  • cert-manager-pgp-2021-09-20-1020CF3C033D4F35BAE1C19E1226061C665DF13E.asc: ASCII 编码的 PGP 公钥,用于通过 helm verify 验证 Helm 图表的签名(在转换为密钥环后)。
  • cert-manager-keyring-2021-09-20-1020CF3C033D4F35BAE1C19E1226061C665DF13E.gpg: 旧式 GPG 密钥环,需要 --keyring 参数传递给 helm verify。请参见下文密钥环部分。
  • cert-manager-pubkey-2021-09-20.pem: 用于签名的原始 PEM 编码的公钥。不能与 GPG(因此也无法与 Helm)一起使用,但应用于其他验证类型。

背景 / 架构

cert-manager 工件的代码签名完全使用云 KMS 密钥完成,以确保没有人可以获取明文私钥;因此,使用密钥的所有签名操作都通过云 API 完成并进行记录。

目前,所有密钥都位于 Google KMS 上,因为 cert-manager 的其余发布基础设施也位于 GCP 中。密钥(以及允许访问它的角色绑定)在 Jetstack 的一个封闭源代码存储库中的 Terraform 中指定。

为什么要引导?

虽然 KMS 密钥不可检索私钥,但必须检索公钥,以便最终用户可以验证密钥生成的签名。在 GCP 中,检索公钥本身是一个 API 调用,它以 PEM 编码格式返回原始密钥。

该 PEM 编码的公钥适用于某些情况(例如,验证使用 cosign 生成的容器签名),但它不足以用于 Helm 图表验证,因为 Helm 图表签名(遗憾的是)需要使用 PGP。

引导 PGP 身份

可以使用一个垫片来将 GCP KMS 用作 PGP 密钥,这使我们能够避免拥有两个独立的签名密钥,但 PGP 公共身份比普通的公钥略微复杂;它们还包含名称、创建时间、注释和电子邮件地址以识别签名者。此公共“身份”本身必须由私钥签名(以证明身份中的信息是合法的)。

可以使用 cert-manager 发布工具 cmrel 完成此引导过程。

# note that the key name might not exactly match this in the future
$ cmrel bootstrap-pgp --key "projects/cert-manager-release/locations/europe-west1/keyRings/cert-manager-release/cryptoKeys/cert-manager-release-signing-key/cryptoKeyVersions/1"

这将触发一个云构建作业,该作业将输出装甲 PGP 身份和原始 PEM 公钥;可以从作业输出中复制这些值。

GPG 密钥环

作为额外的 UX 功能,我们还可以从 PGP 身份生成 GPG 密钥环,因为密钥环是 Helm CLI 实际验证图表所需的。

# Example of verifying a chart.
$ helm verify --keyring cert_manager_keyring_1020CF3C033D4F35BAE1C19E1226061C665DF13E.gpg /path/to/chart.tgz
Signed by: cert-manager Maintainers <cert-manager-maintainers@googlegroups.com>
Using Key With Fingerprint: 1020....
Chart Hash Verified: sha256:bb86...

可以使用 此脚本 生成密钥环。