docker默认自动校验镜像各层sha256哈希(manifest、config、layer),保障内容完整性;而签名验证需主动启用docker_content_trust=1,依赖notary或cosign服务验证发布者可信性。

拉取镜像时自动验证哈希是 Docker 默认行为,不需要额外操作;而“签名”验证则需主动启用内容信任机制。两者目标不同:哈希保障内容未被篡改,签名保障发布者可信。
用 digest 拉取,强制校验内容哈希
Docker 在 pull 过程中会自动完成三层哈希校验(manifest、config、layer),前提是使用 @sha256:xxx 格式拉取,而非 tag:
- 命令示例:
docker pull nginx@sha256:7e002c5e86a91d04b5a041581f580a397373262290597226165420645436474a - 客户端下载 manifest 后,立即计算其 SHA256,与 URL 中 digest 比对;不一致则中断
- 接着校验 manifest 中声明的 config digest 和各 layer digest,每层解压后本地重算 diffID 匹配
- 最终组装 rootfs 时,还会按 chainID 顺序重新推导并比对文件系统哈希
检查已拉取镜像的哈希值是否匹配
如果已用 tag 拉取(如 docker pull nginx:latest),可通过 inspect 查看当前绑定的 digest:
-
docker inspect --format='{{index .RepoDigests 0}}' nginx:latest→ 输出类似nginx@sha256:7e00... - 若返回为空,说明该镜像从未通过 digest 拉取,RepoDigests 字段不会生成,此时无法确认原始一致性
- 也可手动导出再哈希:
docker save nginx:latest | sha256sum,但该值与 manifest digest 无直接对应关系,仅作辅助参考
启用签名验证(Docker Content Trust)
哈希只保“内容不变”,不保“谁发布的”。要验证签名,需开启 DCT:
- 设置环境变量:
export DOCKER_CONTENT_TRUST=1 - 之后所有
docker pull会自动检查 Notary 签名;无签名或签名失效的镜像将被拒绝 - 推送带签名的镜像前,需用
notary或cosign工具签发(例如:cosign sign myreg/app:v1) - 签名信息托管在独立服务(如 Notary Server 或 Sigstore),与 registry 分离,提供来源可追溯性
常见问题处理
遇到 missing signature key 或签名验证失败,优先排查:
- 确认 Docker 版本 ≥ 20.10(旧版本对 DCT 支持不完整)
- 检查系统时间是否准确(证书验证依赖时间戳)
- 私有仓库需配置 Notary 服务端或兼容 Sigstore 的签名存储
- 临时调试可禁用签名检查:
DOCKER_CONTENT_TRUST=0 docker pull ...,但生产环境不应关闭











