代码签名
目录
什么是代码签名?
代码签名是将加密签名应用于软件工件(例如 Docker 镜像)以验证其完整性和真实性的过程。通过签署镜像,您可以确保自签署以来它未被更改,并且它源自可信来源。
在 Docker 强化镜像 (DHI) 的上下文中,代码签名是使用 Cosign 实现的,Cosign 是 Sigstore 项目开发的一个工具。Cosign 能够安全且可验证地签署容器镜像,从而增强软件供应链中的信任和安全性。
为什么代码签名很重要?
代码签名在现代软件开发和网络安全中起着至关重要的作用
- 真实性:验证镜像是否由可信来源创建。
- 完整性:确保自签署以来镜像未被篡改。
- 合规性:帮助满足法规和组织安全要求。
Docker 强化镜像代码签名
每个 DHI 都使用 Cosign 进行加密签名,确保镜像未被篡改并源自可信来源。
为什么要签署自己的镜像?
Docker 强化镜像由 Docker 签名以证明其来源和完整性,但如果您正在构建扩展或使用 DHI 作为基础的应用程序镜像,您也应该签署自己的镜像。
通过签署自己的镜像,您可以
- 证明镜像由您的团队或管道构建
- 确保您的构建在推送后未被篡改
- 支持 SLSA 等软件供应链框架
- 在部署工作流中启用镜像验证
这在您频繁构建和推送镜像的 CI/CD 环境中尤为重要,或在任何需要审计镜像来源的场景中。
如何查看和使用代码签名
查看签名
您可以使用 Docker Scout 或 Cosign 验证 Docker 强化镜像是否已签名且受信任。
要列出附加到镜像的所有证明(包括签名元数据),请使用以下命令
$ docker scout attest list <image-name>:<tag> --platform <platform>
要验证特定的已签名证明(例如 SBOM、VEX、来源)
$ docker scout attest get \
--predicate-type <predicate-uri> \
--verify \
<image-name>:<tag> --platform <platform>
例如:
$ docker scout attest get \
--predicate-type https://openvex.dev/ns/v0.2.0 \
--verify \
docs/dhi-python:3.13 --platform linux/amd64
如果有效,Docker Scout 将确认签名并显示签名有效负载,以及验证镜像的等效 Cosign 命令。
签署镜像
要签署 Docker 镜像,请使用 Cosign。将 <image-name>:<tag> 替换为镜像名称和标签。
$ cosign sign <image-name>:<tag>
此命令将提示您通过 OIDC 提供商(如 GitHub、Google 或 Microsoft)进行身份验证。成功进行身份验证后,Cosign 将生成一个短期证书并签署镜像。签名将存储在透明日志中,并与注册表中的镜像相关联。