镜像来源可信是软件供应链安全的核心。在 Java 微服务交付中,镜像可能经过多次传递与存储,仅靠哈希摘要无法证明发布者身份。容器镜像签名 通过密码学手段将镜像与可信身份绑定,确保镜像在发布后未被篡改且确实来自声称的发布者。Notation 和 Cosign 是目前云原生生态中的两种主流签名验证工具,它们分别代表了基于 OCI 分发和基于 Sigstore 无密钥生态的签名理念。
一、签名如何保证镜像来源可信
镜像签名不是简单地"盖章",而是构建一条从身份 到镜像内容的信任链。
#mermaid-svg-mdKG7dTwwuMygOmB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mdKG7dTwwuMygOmB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mdKG7dTwwuMygOmB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mdKG7dTwwuMygOmB .error-icon{fill:#552222;}#mermaid-svg-mdKG7dTwwuMygOmB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mdKG7dTwwuMygOmB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mdKG7dTwwuMygOmB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mdKG7dTwwuMygOmB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mdKG7dTwwuMygOmB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mdKG7dTwwuMygOmB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mdKG7dTwwuMygOmB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mdKG7dTwwuMygOmB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mdKG7dTwwuMygOmB .marker.cross{stroke:#333333;}#mermaid-svg-mdKG7dTwwuMygOmB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mdKG7dTwwuMygOmB p{margin:0;}#mermaid-svg-mdKG7dTwwuMygOmB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mdKG7dTwwuMygOmB .cluster-label text{fill:#333;}#mermaid-svg-mdKG7dTwwuMygOmB .cluster-label span{color:#333;}#mermaid-svg-mdKG7dTwwuMygOmB .cluster-label span p{background-color:transparent;}#mermaid-svg-mdKG7dTwwuMygOmB .label text,#mermaid-svg-mdKG7dTwwuMygOmB span{fill:#333;color:#333;}#mermaid-svg-mdKG7dTwwuMygOmB .node rect,#mermaid-svg-mdKG7dTwwuMygOmB .node circle,#mermaid-svg-mdKG7dTwwuMygOmB .node ellipse,#mermaid-svg-mdKG7dTwwuMygOmB .node polygon,#mermaid-svg-mdKG7dTwwuMygOmB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mdKG7dTwwuMygOmB .rough-node .label text,#mermaid-svg-mdKG7dTwwuMygOmB .node .label text,#mermaid-svg-mdKG7dTwwuMygOmB .image-shape .label,#mermaid-svg-mdKG7dTwwuMygOmB .icon-shape .label{text-anchor:middle;}#mermaid-svg-mdKG7dTwwuMygOmB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mdKG7dTwwuMygOmB .rough-node .label,#mermaid-svg-mdKG7dTwwuMygOmB .node .label,#mermaid-svg-mdKG7dTwwuMygOmB .image-shape .label,#mermaid-svg-mdKG7dTwwuMygOmB .icon-shape .label{text-align:center;}#mermaid-svg-mdKG7dTwwuMygOmB .node.clickable{cursor:pointer;}#mermaid-svg-mdKG7dTwwuMygOmB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mdKG7dTwwuMygOmB .arrowheadPath{fill:#333333;}#mermaid-svg-mdKG7dTwwuMygOmB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mdKG7dTwwuMygOmB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mdKG7dTwwuMygOmB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mdKG7dTwwuMygOmB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mdKG7dTwwuMygOmB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mdKG7dTwwuMygOmB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mdKG7dTwwuMygOmB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mdKG7dTwwuMygOmB .cluster text{fill:#333;}#mermaid-svg-mdKG7dTwwuMygOmB .cluster span{color:#333;}#mermaid-svg-mdKG7dTwwuMygOmB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mdKG7dTwwuMygOmB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mdKG7dTwwuMygOmB rect.text{fill:none;stroke-width:0;}#mermaid-svg-mdKG7dTwwuMygOmB .icon-shape,#mermaid-svg-mdKG7dTwwuMygOmB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mdKG7dTwwuMygOmB .icon-shape p,#mermaid-svg-mdKG7dTwwuMygOmB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mdKG7dTwwuMygOmB .icon-shape .label rect,#mermaid-svg-mdKG7dTwwuMygOmB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mdKG7dTwwuMygOmB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mdKG7dTwwuMygOmB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mdKG7dTwwuMygOmB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 消费端
是
否
拉取镜像及签名
使用公钥验证签名
签名有效且身份匹配?
信任镜像,允许部署
拒绝镜像
发布端
构建镜像
计算镜像清单 Digest
使用私钥对 Digest 签名
生成签名对象
推送签名至注册表
- 完整性:签名覆盖镜像的不可变摘要(Digest),任何内容篡改都会导致签名验证失败。
- 不可否认性:签名使用私钥生成,只有私钥持有者才能产生有效签名。
- 身份绑定:签名包含签名者身份信息(如用户 ID、构建管道、组织),验证者可据此判断发布者。
二、Notation 与 Cosign 的核心区别
| 维度 | Notation | Cosign |
|---|---|---|
| 所属项目 | CNCF 毕业项目,由微软、Docker 等推动 | Sigstore 项目,由 Google、Linux 基金会支持 |
| 签名标准 | 基于 OCI 1.1 签名规范,签名与镜像存储在同一仓库中 | 基于 Sigstore 协议,支持多种存储方式(含 OCI) |
| 核心能力 | 管理签名与验证,支持插件扩展,与 Docker CLI 集成 | 支持无密钥签名(OIDC)、透明日志(Rekor)、SBOM 签名 |
| 信任建立 | 基于 X.509 证书链,可对接 SPIFFE/SPIRE 等 | 基于公钥对或 OIDC 身份(通过 Fulcio 签发短期证书) |
| 典型场景 | 企业环境,已有 PKI 体系,需要细粒度证书策略 | 云原生 CI/CD,追求零密钥管理和公开可审计性 |
| 与 Docker 集成 | Docker Desktop 内置 Notation,可直接 docker trust sign 调用 |
需独立安装 Cosign CLI,可嵌入流水线 |
| Java 场景适配 | 适合与私有 CA 结合,对内部 Java 基础镜像强签名管理 | 适合开源项目、跨组织协作,结合 GitHub Actions 等 OIDC 认证 |
三、Notation 的工作原理与架构
Notation 完全遵循 OCI 1.1 Reference Types ,签名作为与镜像关联的工件存储在同一仓库中。它采用插件式架构,签名生成、验证、密钥管理均由插件提供。
#mermaid-svg-q6w2XmNHDzMniYvN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-q6w2XmNHDzMniYvN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-q6w2XmNHDzMniYvN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-q6w2XmNHDzMniYvN .error-icon{fill:#552222;}#mermaid-svg-q6w2XmNHDzMniYvN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-q6w2XmNHDzMniYvN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-q6w2XmNHDzMniYvN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-q6w2XmNHDzMniYvN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-q6w2XmNHDzMniYvN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-q6w2XmNHDzMniYvN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-q6w2XmNHDzMniYvN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-q6w2XmNHDzMniYvN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-q6w2XmNHDzMniYvN .marker.cross{stroke:#333333;}#mermaid-svg-q6w2XmNHDzMniYvN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-q6w2XmNHDzMniYvN p{margin:0;}#mermaid-svg-q6w2XmNHDzMniYvN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-q6w2XmNHDzMniYvN .cluster-label text{fill:#333;}#mermaid-svg-q6w2XmNHDzMniYvN .cluster-label span{color:#333;}#mermaid-svg-q6w2XmNHDzMniYvN .cluster-label span p{background-color:transparent;}#mermaid-svg-q6w2XmNHDzMniYvN .label text,#mermaid-svg-q6w2XmNHDzMniYvN span{fill:#333;color:#333;}#mermaid-svg-q6w2XmNHDzMniYvN .node rect,#mermaid-svg-q6w2XmNHDzMniYvN .node circle,#mermaid-svg-q6w2XmNHDzMniYvN .node ellipse,#mermaid-svg-q6w2XmNHDzMniYvN .node polygon,#mermaid-svg-q6w2XmNHDzMniYvN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-q6w2XmNHDzMniYvN .rough-node .label text,#mermaid-svg-q6w2XmNHDzMniYvN .node .label text,#mermaid-svg-q6w2XmNHDzMniYvN .image-shape .label,#mermaid-svg-q6w2XmNHDzMniYvN .icon-shape .label{text-anchor:middle;}#mermaid-svg-q6w2XmNHDzMniYvN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-q6w2XmNHDzMniYvN .rough-node .label,#mermaid-svg-q6w2XmNHDzMniYvN .node .label,#mermaid-svg-q6w2XmNHDzMniYvN .image-shape .label,#mermaid-svg-q6w2XmNHDzMniYvN .icon-shape .label{text-align:center;}#mermaid-svg-q6w2XmNHDzMniYvN .node.clickable{cursor:pointer;}#mermaid-svg-q6w2XmNHDzMniYvN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-q6w2XmNHDzMniYvN .arrowheadPath{fill:#333333;}#mermaid-svg-q6w2XmNHDzMniYvN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-q6w2XmNHDzMniYvN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-q6w2XmNHDzMniYvN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-q6w2XmNHDzMniYvN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-q6w2XmNHDzMniYvN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-q6w2XmNHDzMniYvN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-q6w2XmNHDzMniYvN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-q6w2XmNHDzMniYvN .cluster text{fill:#333;}#mermaid-svg-q6w2XmNHDzMniYvN .cluster span{color:#333;}#mermaid-svg-q6w2XmNHDzMniYvN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-q6w2XmNHDzMniYvN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-q6w2XmNHDzMniYvN rect.text{fill:none;stroke-width:0;}#mermaid-svg-q6w2XmNHDzMniYvN .icon-shape,#mermaid-svg-q6w2XmNHDzMniYvN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-q6w2XmNHDzMniYvN .icon-shape p,#mermaid-svg-q6w2XmNHDzMniYvN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-q6w2XmNHDzMniYvN .icon-shape .label rect,#mermaid-svg-q6w2XmNHDzMniYvN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-q6w2XmNHDzMniYvN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-q6w2XmNHDzMniYvN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-q6w2XmNHDzMniYvN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} docker push
notation sign
调用签名插件
使用私钥/证书
生成 JWS 签名
推送
notation verify
调用验证插件
拉取信任策略/证书
拉取
比对 Digest 与签名
通过/拒绝
开发者
镜像仓库
Notation CLI
签名插件
如: notation-azure-kv
密钥管理
Azure Key Vault / HSM
OCI 签名工件
消费端
验证插件
如: notation-x509
信任存储
CA 证书链
部署流水线
关键机制:
- 信任策略 :Notation 使用
trustpolicy.json定义哪些签名者可信、允许哪些身份、是否需要 Sigstore 等。例如,仅信任由企业内部 CA 签发、组织名为myorg.com的签名。 - 证书管理:支持 X.509 证书链验证、时间戳、吊销检查,适合需合规审计的企业。
- 与 Docker 集成 :Docker CLI 通过
docker trust sign和docker trust inspect与 Notation 交互,为用户提供统一的体验。
四、Cosign 的工作原理与架构
Cosign 是 Sigstore 生态的核心工具,支持无密钥签名 和透明日志,旨在让签名变得极简且可公开审计。
#mermaid-svg-la3R2CMVPeqHVRnR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-la3R2CMVPeqHVRnR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-la3R2CMVPeqHVRnR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-la3R2CMVPeqHVRnR .error-icon{fill:#552222;}#mermaid-svg-la3R2CMVPeqHVRnR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-la3R2CMVPeqHVRnR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-la3R2CMVPeqHVRnR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-la3R2CMVPeqHVRnR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-la3R2CMVPeqHVRnR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-la3R2CMVPeqHVRnR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-la3R2CMVPeqHVRnR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-la3R2CMVPeqHVRnR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-la3R2CMVPeqHVRnR .marker.cross{stroke:#333333;}#mermaid-svg-la3R2CMVPeqHVRnR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-la3R2CMVPeqHVRnR p{margin:0;}#mermaid-svg-la3R2CMVPeqHVRnR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-la3R2CMVPeqHVRnR .cluster-label text{fill:#333;}#mermaid-svg-la3R2CMVPeqHVRnR .cluster-label span{color:#333;}#mermaid-svg-la3R2CMVPeqHVRnR .cluster-label span p{background-color:transparent;}#mermaid-svg-la3R2CMVPeqHVRnR .label text,#mermaid-svg-la3R2CMVPeqHVRnR span{fill:#333;color:#333;}#mermaid-svg-la3R2CMVPeqHVRnR .node rect,#mermaid-svg-la3R2CMVPeqHVRnR .node circle,#mermaid-svg-la3R2CMVPeqHVRnR .node ellipse,#mermaid-svg-la3R2CMVPeqHVRnR .node polygon,#mermaid-svg-la3R2CMVPeqHVRnR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-la3R2CMVPeqHVRnR .rough-node .label text,#mermaid-svg-la3R2CMVPeqHVRnR .node .label text,#mermaid-svg-la3R2CMVPeqHVRnR .image-shape .label,#mermaid-svg-la3R2CMVPeqHVRnR .icon-shape .label{text-anchor:middle;}#mermaid-svg-la3R2CMVPeqHVRnR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-la3R2CMVPeqHVRnR .rough-node .label,#mermaid-svg-la3R2CMVPeqHVRnR .node .label,#mermaid-svg-la3R2CMVPeqHVRnR .image-shape .label,#mermaid-svg-la3R2CMVPeqHVRnR .icon-shape .label{text-align:center;}#mermaid-svg-la3R2CMVPeqHVRnR .node.clickable{cursor:pointer;}#mermaid-svg-la3R2CMVPeqHVRnR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-la3R2CMVPeqHVRnR .arrowheadPath{fill:#333333;}#mermaid-svg-la3R2CMVPeqHVRnR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-la3R2CMVPeqHVRnR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-la3R2CMVPeqHVRnR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-la3R2CMVPeqHVRnR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-la3R2CMVPeqHVRnR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-la3R2CMVPeqHVRnR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-la3R2CMVPeqHVRnR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-la3R2CMVPeqHVRnR .cluster text{fill:#333;}#mermaid-svg-la3R2CMVPeqHVRnR .cluster span{color:#333;}#mermaid-svg-la3R2CMVPeqHVRnR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-la3R2CMVPeqHVRnR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-la3R2CMVPeqHVRnR rect.text{fill:none;stroke-width:0;}#mermaid-svg-la3R2CMVPeqHVRnR .icon-shape,#mermaid-svg-la3R2CMVPeqHVRnR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-la3R2CMVPeqHVRnR .icon-shape p,#mermaid-svg-la3R2CMVPeqHVRnR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-la3R2CMVPeqHVRnR .icon-shape .label rect,#mermaid-svg-la3R2CMVPeqHVRnR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-la3R2CMVPeqHVRnR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-la3R2CMVPeqHVRnR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-la3R2CMVPeqHVRnR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 验证流程
签名流程
cosign sign
获取 OIDC Token
请求短期证书
签发证书
生成签名
上传签名记录
cosign verify
拉取签名
查询 Rekor
验证证书链
验证身份绑定
通过/拒绝
开发者
Cosign CLI
OIDC Provider
GitHub, Google
Fulcio CA
OCI 注册表
标签: sha256-xxx.sig
Rekor 透明日志
消费端
Cosign CLI
Fulcio / TUF 根
准入控制器
关键机制:
- 无密钥模式:开发者无需管理私钥。构建时 Cosign 自动获取 OIDC Token(如 GitHub Actions 工作流身份),由 Fulcio 签发短期证书用于签名。证书在几分钟内过期,即使泄露影响极小。
- Rekor 透明日志:所有签名事件公开记录在防篡改的 Merkle Tree 日志中。任何用户可查证签名时间、签名者身份,实现不可否认性。
- 密钥对模式:也支持传统公私钥对,适合离线或私密环境。
- 扩展能力:可签名 SBOM、in-toto 证明、加密镜像等。
五、选择决策与实践流程
在 Java 企业项目中,如何确保基础镜像 eclipse-temurin:17-jre 或团队构建的微服务镜像可信?
#mermaid-svg-thnMbiyo5p2lCgPz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-thnMbiyo5p2lCgPz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-thnMbiyo5p2lCgPz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-thnMbiyo5p2lCgPz .error-icon{fill:#552222;}#mermaid-svg-thnMbiyo5p2lCgPz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-thnMbiyo5p2lCgPz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-thnMbiyo5p2lCgPz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-thnMbiyo5p2lCgPz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-thnMbiyo5p2lCgPz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-thnMbiyo5p2lCgPz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-thnMbiyo5p2lCgPz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-thnMbiyo5p2lCgPz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-thnMbiyo5p2lCgPz .marker.cross{stroke:#333333;}#mermaid-svg-thnMbiyo5p2lCgPz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-thnMbiyo5p2lCgPz p{margin:0;}#mermaid-svg-thnMbiyo5p2lCgPz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-thnMbiyo5p2lCgPz .cluster-label text{fill:#333;}#mermaid-svg-thnMbiyo5p2lCgPz .cluster-label span{color:#333;}#mermaid-svg-thnMbiyo5p2lCgPz .cluster-label span p{background-color:transparent;}#mermaid-svg-thnMbiyo5p2lCgPz .label text,#mermaid-svg-thnMbiyo5p2lCgPz span{fill:#333;color:#333;}#mermaid-svg-thnMbiyo5p2lCgPz .node rect,#mermaid-svg-thnMbiyo5p2lCgPz .node circle,#mermaid-svg-thnMbiyo5p2lCgPz .node ellipse,#mermaid-svg-thnMbiyo5p2lCgPz .node polygon,#mermaid-svg-thnMbiyo5p2lCgPz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-thnMbiyo5p2lCgPz .rough-node .label text,#mermaid-svg-thnMbiyo5p2lCgPz .node .label text,#mermaid-svg-thnMbiyo5p2lCgPz .image-shape .label,#mermaid-svg-thnMbiyo5p2lCgPz .icon-shape .label{text-anchor:middle;}#mermaid-svg-thnMbiyo5p2lCgPz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-thnMbiyo5p2lCgPz .rough-node .label,#mermaid-svg-thnMbiyo5p2lCgPz .node .label,#mermaid-svg-thnMbiyo5p2lCgPz .image-shape .label,#mermaid-svg-thnMbiyo5p2lCgPz .icon-shape .label{text-align:center;}#mermaid-svg-thnMbiyo5p2lCgPz .node.clickable{cursor:pointer;}#mermaid-svg-thnMbiyo5p2lCgPz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-thnMbiyo5p2lCgPz .arrowheadPath{fill:#333333;}#mermaid-svg-thnMbiyo5p2lCgPz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-thnMbiyo5p2lCgPz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-thnMbiyo5p2lCgPz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-thnMbiyo5p2lCgPz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-thnMbiyo5p2lCgPz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-thnMbiyo5p2lCgPz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-thnMbiyo5p2lCgPz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-thnMbiyo5p2lCgPz .cluster text{fill:#333;}#mermaid-svg-thnMbiyo5p2lCgPz .cluster span{color:#333;}#mermaid-svg-thnMbiyo5p2lCgPz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-thnMbiyo5p2lCgPz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-thnMbiyo5p2lCgPz rect.text{fill:none;stroke-width:0;}#mermaid-svg-thnMbiyo5p2lCgPz .icon-shape,#mermaid-svg-thnMbiyo5p2lCgPz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-thnMbiyo5p2lCgPz .icon-shape p,#mermaid-svg-thnMbiyo5p2lCgPz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-thnMbiyo5p2lCgPz .icon-shape .label rect,#mermaid-svg-thnMbiyo5p2lCgPz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-thnMbiyo5p2lCgPz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-thnMbiyo5p2lCgPz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-thnMbiyo5p2lCgPz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是,有内部 CA
否,主要使用云 CI
需公开审计
仅内部审计
需保护镜像来源
是否已有 PKI 体系?
采用 Notation
配合 X.509 证书链
采用 Cosign
无密钥签名 + OIDC
集成到 Docker Build Pipeline
部署时验证签名
Kubernetes Admission Webhook
审计需求?
Cosign + Rekor 透明日志
Notation 信任策略 + 日志
典型的交付流水线整合(以 Cosign 为例):
Kubernetes Rekor 日志 Fulcio CA Harbor GitHub Actions Java 开发者 Kubernetes Rekor 日志 Fulcio CA Harbor GitHub Actions Java 开发者 #mermaid-svg-Uqd3UKtYfBKHnWr1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .error-icon{fill:#552222;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .marker.cross{stroke:#333333;}#mermaid-svg-Uqd3UKtYfBKHnWr1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Uqd3UKtYfBKHnWr1 p{margin:0;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Uqd3UKtYfBKHnWr1 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Uqd3UKtYfBKHnWr1 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Uqd3UKtYfBKHnWr1 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .sequenceNumber{fill:white;}#mermaid-svg-Uqd3UKtYfBKHnWr1 #sequencenumber{fill:#333;}#mermaid-svg-Uqd3UKtYfBKHnWr1 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .messageText{fill:#333;stroke:none;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .labelText,#mermaid-svg-Uqd3UKtYfBKHnWr1 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .loopText,#mermaid-svg-Uqd3UKtYfBKHnWr1 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Uqd3UKtYfBKHnWr1 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .noteText,#mermaid-svg-Uqd3UKtYfBKHnWr1 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .actorPopupMenu{position:absolute;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Uqd3UKtYfBKHnWr1 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Uqd3UKtYfBKHnWr1 .actor-man circle,#mermaid-svg-Uqd3UKtYfBKHnWr1 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Uqd3UKtYfBKHnWr1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提交代码,触发构建docker build -t myapp:v1 .cosign sign myapp:v1用 GitHub Token 换取短期证书上传签名记录推送镜像及签名构建完成部署时拉取 myapp:v1准入控制器调用 cosign verify拉取签名工件验证证书链查询签名条目身份匹配 (来自 CI 管道),签名有效允许 Pod 创建
六、Java 面试追问与回答思路
问:签名和 Digest 验证的区别?为何 Digest 不够?
答:Digest(如 sha256:...)可保证镜像内容在传输中未被损坏,但不能证明"谁"发布的。攻击者可以替换镜像并重新计算 Digest。签名将内容与发布者身份通过私钥绑定,是无法伪造的。
问:Notation 和 Cosign 能互相替代吗?
答:部分重叠但非完全替代。Notation 专注于 OCI 签名标准化和证书生态,适合企业强 PKI 需求。Cosign 偏向零密钥管理和透明审计,适合 DevSecOps 和开源协作。很多企业两者混用,例如用 Cosign 签开源组件,用 Notation 签内部服务。
问:如何防止签名密钥泄露风险?
答:使用无密钥模式(Cosign OIDC)完全避免长期密钥存储;若用传统密钥,应将私钥存放在硬件安全模块(HSM)或云密钥管理服务中,并定期轮转。Notation 支持插件与 Azure Key Vault、AWS KMS 集成,避免私钥落入 CI 环境。
问:Java 镜像的签名粒度如何把握?
答:应对所有生产发布的镜像签名,包括基础 JDK 镜像(如果是自己维护的)和应用镜像。开发快照镜像可适当放宽。配合 Harbor 等仓库的策略,可强制只拉取已签名的镜像。
七、思维导图总结
#mermaid-svg-MUwv2vn5BGdpJhfK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MUwv2vn5BGdpJhfK .error-icon{fill:#552222;}#mermaid-svg-MUwv2vn5BGdpJhfK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MUwv2vn5BGdpJhfK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MUwv2vn5BGdpJhfK .marker.cross{stroke:#333333;}#mermaid-svg-MUwv2vn5BGdpJhfK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MUwv2vn5BGdpJhfK p{margin:0;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge{stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .section--1 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section--1 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section--1 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section--1 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section--1 text{fill:#ffffff;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth--1{stroke-width:17;}#mermaid-svg-MUwv2vn5BGdpJhfK .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-0 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-0 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-0 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-0 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-0 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-0{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-0{stroke-width:14;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-1 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-1 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-1 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-1 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-1 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-1{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-1{stroke-width:11;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 text{fill:#ffffff;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-2{stroke-width:8;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-3 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-3 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-3 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-3 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-3 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-3{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-3{stroke-width:5;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-4 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-4 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-4 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-4 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-4 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-4{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-4{stroke-width:2;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-5 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-5 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-5 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-5 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-5 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-5{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-5{stroke-width:-1;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-6 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-6 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-6 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-6 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-6 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-6{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-6{stroke-width:-4;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-7 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-7 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-7 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-7 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-7 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-7{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-7{stroke-width:-7;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-8 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-8 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-8 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-8 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-8 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-8{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-8{stroke-width:-10;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-9 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-9 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-9 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-9 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-9 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-9{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-9{stroke-width:-13;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-10 rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-10 path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-10 circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-10 polygon,#mermaid-svg-MUwv2vn5BGdpJhfK .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-10 text{fill:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .node-icon-10{font-size:40px;color:black;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .edge-depth-10{stroke-width:-16;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled circle,#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:lightgray;}#mermaid-svg-MUwv2vn5BGdpJhfK .disabled text{fill:#efefef;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-root rect,#mermaid-svg-MUwv2vn5BGdpJhfK .section-root path,#mermaid-svg-MUwv2vn5BGdpJhfK .section-root circle,#mermaid-svg-MUwv2vn5BGdpJhfK .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-MUwv2vn5BGdpJhfK .section-root text{fill:#ffffff;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-root span{color:#ffffff;}#mermaid-svg-MUwv2vn5BGdpJhfK .section-2 span{color:#ffffff;}#mermaid-svg-MUwv2vn5BGdpJhfK .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-MUwv2vn5BGdpJhfK .edge{fill:none;}#mermaid-svg-MUwv2vn5BGdpJhfK .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-MUwv2vn5BGdpJhfK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 镜像来源可信
核心概念
签名 = 完整性 + 身份
摘要 != 身份认证
工具
Notation
OCI 1.1 标准
X.509 证书链
插件式密钥管理
信任策略文件
Cosign
Sigstore 生态
无密钥签名 + OIDC
Rekor 透明日志
支持密钥对模式
决策因素
现有 PKI 系统
零密钥管理需求
审计透明度
与 CI/CD 集成度
Java 实践
构建流水线自动签名
部署时准入验证
基础镜像可信来源
定期轮转密钥/证书
总结:确保镜像来源可信是软件供应链安全的基石。Notation 与 Cosign 分别代表了标准化证书签名和现代化的无密钥生态。Java 工程师需要在理解两者原理的基础上,根据企业现有安全基础设施与合规要求,选择合适的工具链,将签名无缝嵌入 CI/CD 与部署流程,从而构建防篡改、可追溯的镜像交付体系。