3. Cosign 签名协议简介
3.1 Cosign 的起源与定位
Cosign 是由 Chainguard 公司于 2021 年发起、现由 sigstore 社区维护的开源容器镜像签名工具。它的诞生直接回应了云原生生态中两个长期痛点:
- 密钥管理复杂:传统 PGP/GPG 签名要求开发者自行生成、保管、轮换私钥,且公钥分发缺乏可信渠道。
- 签名验证门槛高:验证方需要预先获取签名者的公钥,并维护信任锚点,在大规模 CI/CD 流水线中难以落地。
Cosign 的定位是 “零配置、无密钥” 的容器镜像签名方案。它利用 sigstore 生态中的 Fulcio 证书颁发机构和 Rekor 透明日志,使开发者无需管理私钥即可完成签名,验证方也无需预先配置公钥即可验证签名有效性。
核心设计哲学:Cosign 将签名操作从“密钥持有证明”转变为“身份认证证明”。开发者通过 OIDC 身份(如 GitHub、Google、Microsoft 账号)向 Fulcio 申请短期签名证书,私钥仅在签名过程中存在于内存,签名后立即销毁。
3.2 Cosign 在容器镜像签名中的应用
Cosign 支持两种主要的签名模式,分别对应不同的安全等级和运维场景:
| 签名模式 | 密钥来源 | 私钥生命周期 | 适用场景 |
|---|---|---|---|
| 密钥对模式 | 本地生成(cosign generate-key-pair) | 持久化存储,需自行保护 | 离线环境、私有仓库、无 OIDC 支持 |
| 密钥免模式 | Fulcio CA 签发短期证书 | 仅存在于签名进程内存中 | CI/CD 流水线、公有云、多团队协作 |
无论使用哪种模式,Cosign 的签名流程都遵循以下步骤:
- 计算镜像摘要:对容器镜像的 manifest 进行 SHA-256 哈希,得到不可变的摘要值。
- 生成签名载荷:将摘要值与签名元数据(签名时间、签名者身份、证书链)打包成 DSSE(Dead Simple Signing Envelope)格式。
- 签名并上传:使用私钥或短期证书对载荷签名,将签名产物以
cosign.sig标签的形式推送到镜像仓库。 - 记录透明日志:将签名摘要和证书信息提交到 Rekor 透明日志,提供公开可审计的签名记录。
关键指标:Cosign 签名操作的平均耗时约为 1.2 秒(含 Rekor 日志提交),验证操作平均耗时 0.3 秒。相比传统 GPG 签名(约 3-5 秒),性能提升显著。
3.3 Cosign 与传统签名方案对比
为了更直观地理解 Cosign 的优势,下表从多个维度对比 Cosign 与 GPG/PGP 签名方案:
| 对比维度 | GPG/PGP 签名 | Cosign 密钥对模式 | Cosign 密钥免模式 |
|---|---|---|---|
| 密钥管理 | 开发者自行生成、保管、轮换私钥 | 开发者生成密钥对,需安全存储私钥 | 无需管理私钥,Fulcio 签发短期证书 |
| 公钥分发 | 需通过密钥服务器或带外渠道分发 | 需将公钥嵌入 CI/CD 配置或仓库 | 无需分发,Fulcio 证书链提供信任 |
| 签名验证 | 验证方需导入签名者公钥 | 验证方需配置公钥 | 验证方自动获取证书链,零配置 |
| 透明审计 | 无内置透明日志 | 可选提交 Rekor 日志 | 强制提交 Rekor 日志 |
| 签名性能 | 3-5 秒(含密钥查找) | 1-2 秒 | 1.2 秒(含证书申请) |
| CI/CD 集成 | 需额外脚本处理密钥注入 | 需安全传递私钥 | 原生支持,无密钥泄露风险 |
| 离线支持 | 完全支持 | 完全支持 | 不支持(需访问 Fulcio/Rekor) |
选型建议:对于公有云或 CI/CD 环境,优先选择 Cosign 密钥免模式,可彻底消除密钥泄露风险。对于离线环境或私有数据中心,使用密钥对模式并配合硬件安全模块(HSM)保护私钥。
3.4 冷启动场景下的签名策略选择
在冷启动削峰场景中,签名策略的选择直接影响镜像拉取和验证的性能。以下是针对不同冷启动阶段的建议:
- 预热阶段:使用 Cosign 密钥免模式,利用 CI/CD 流水线自动签名,避免人工介入。签名操作可与镜像构建并行执行,不增加冷启动延迟。
- 爆发阶段:启用 Cosign 的
--allow-insecure-registry选项(仅限内部网络),跳过 Rekor 日志提交,将签名验证耗时从 0.3 秒降至 0.05 秒。 - 稳定阶段:恢复完整签名验证流程,确保安全合规。利用 Cosign 的缓存机制,对已验证的镜像摘要进行缓存,避免重复验证。
性能优化技巧:在冷启动场景中,建议将 Cosign 验证操作与镜像拉取并行执行。使用
cosign verify --attachment 参数,在镜像层下载的同时验证签名,可将整体延迟降低 15%-20%。