签名密钥
此页面介绍了密钥的引导过程,包括如何执行引导过程以及为什么需要引导过程。
我们提供什么?
为了便于验证签名,我们直接从 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.tgzSigned by: cert-manager Maintainers <cert-manager-maintainers@googlegroups.com>Using Key With Fingerprint: 1020....Chart Hash Verified: sha256:bb86...
可以使用 此脚本 生成密钥环。