介绍
Waymark 发布徒步节指南。供应商送来了几个更新交付包。你的工作是接收主办方要求的版本,不能仅凭校验和匹配就信任交付包。
你将使用独立提供的发布者公钥,用 Cosign 验证真实签名,比较所请求的产品和版本,并检查归档摘要。你需要掌握基本终端和路径操作;无需编程或云账户。本实验负责选择更新。下一个引导实验会把这些判断变为可复用的接收脚本。
从徒步节指南和更新请求开始
本步骤先查看正常运行的服务,找到主办方的请求,再选择更新。打开 Event Guide 标签页。当前 event-guide 的版本为 2.0。打开 Old Mill Walk:集合时间是 11:00。使用页面上的 All walks 链接返回,然后下载路线表。网站和 CSV 描述的是相同的两条步行路线。
指南首页在标题上方标明版本,并在每条路线的卡片上显示集合时间:

现在切换到 Workspace。这个终端和指南共用同一个容器;这些标签页是不同入口,并非不同机器。cd 用来改变终端的当前目录。以下绝对路径可以在任何目录中使用:
cd /home/labex/project/waymark
cat 显示小型文本文件。阅读主办方独立于交付包提供的请求:
cat /opt/labex-waymark/trust/request.json
该 JSON 对象包含两个命名字段:
{
"product": "event-guide",
"version": "2.1"
}
产品标识要更新哪一份指南;版本标识请求的版次。真实的旧版本并不是本次更新。独立固定的公钥为 /opt/labex-waymark/trust/publisher.pub。不要改动这个公钥和请求。
ls 列出目录条目。查看交付目录:
ls candidates
交付包使用 parcel-101 等交付标签;名称不代表批准证据。每个包都包含 manifest.json、manifest.sigstore.json、guide.tar.gz 和 SHA256SUMS。清单描述产品、版本和归档摘要。签名包保存签名。归档保存实际指南文件。保持原始交付包、当前指南、历史发布和访客须知完整。你将把选中的交付包复制到 accepted/。
如果命令报告 No such file or directory,运行上面的绝对路径 cd 命令,用 ls candidates 检查拼写,然后重试。本实验中的操作都不需要重置环境。
理解校验和匹配能说明什么
本步骤将比较两个都能通过旁附校验和检查的交付包。留在 Workspace。
SHA-256 摘要是根据文件字节计算出的指纹。在预期指纹本身可信的前提下,指纹匹配有助于发现字节变化。sha256sum -c 读取校验和列表,将其中命名的文件与列表进行比较。这里的 -c 表示“检查”。由于列表使用相对文件名,请在交付包目录内运行:
cd candidates/parcel-103
sha256sum -c SHA256SUMS
预期输出为 guide.tar.gz: OK。返回项目并尝试另一个交付包:
cd /home/labex/project/waymark/candidates/parcel-104
sha256sum -c SHA256SUMS
同样预期输出 guide.tar.gz: OK。这两个列表都与归档在同一次交付中送达。替换归档的人也可以计算新的旁附校验和。OK 只能证明这两个文件相互一致;它不能识别发布者,也不能证明这是所请求的更新。
返回项目:
cd /home/labex/project/waymark
接下来,你将使用主办方已经信任的公钥验证清单。这样,归档的预期摘要将来自经过验证的清单,而非未经签名的旁附列表。
使用独立公钥验证发布者
本步骤将区分可信的真实签名与未获批准的密钥所做的签名。从 Workspace 的 /home/labex/project/waymark 目录开始。
发布者用私钥签署文件。相应公钥让接收者能够验证签名,并发现已签名文件的变化。公钥必须通过你已经信任的渠道获得。交付包不能批准它自己的密钥。本练习固定使用单独提供在 /opt/labex-waymark/trust/ 下的合成发布者公钥;你不会获得发布者私钥。
Cosign 是已准备好的签名工具。verify-blob 验证文件;--key 选择可信公钥;--bundle 选择签名包。最后一个参数指定被签名字节所属的确切清单。
这些合成交付包签名时没有使用公共透明日志。--insecure-ignore-tlog 明确跳过日志收录验证。它仍要求签名在所选公钥下有效。本地练习不会验证公共 OIDC 身份、证书服务或透明日志;不要把这一例外照搬到要求这些服务的策略中。
下面的交付包由另一把密钥签名。预期验证失败,返回非零退出状态,并显示签名验证错误:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-102/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-102/manifest.json
echo 打印值;$? 是紧前一条命令的退出状态。零表示成功,非零数字表示失败。立即查看:
echo $?
现在验证固定发布者签署的交付包:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-104/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-104/manifest.json
预期出现透明日志警告和 Verified OK:
WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob.
Verified OK
检查紧前一条命令的状态:
echo $?
预期为 0。清单由可信密钥签署。这只是其中一个判断;你还需要检查清单批准了什么。
检查签名的产品、版本和归档摘要
本步骤使用已验证的清单判断一个真实交付包是否为所请求的发布。留在 Workspace。
先验证真实的旧版本。该命令预期成功:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-101/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-101/manifest.json
jq 读取 JSON。过滤器 .product, .version 打印这两个命名字段。单引号将过滤器保留为一个参数,避免 shell 解释其中的标点:
jq '.product, .version' candidates/parcel-101/manifest.json
预期为 "event-guide" 和 "2.0"。这是一个真实的指南,但并非请求的 2.1。签名不会自动让旧版本变得适用。
查看上一步已验证的候选包:
cat candidates/parcel-104/manifest.json
它的产品和版本与独立请求一致。sha256 字段是 guide.tar.gz 的 64 字符十六进制摘要;无需记住它。jq -r 打印字段时去掉 JSON 引号。打印预期摘要:
jq -r .sha256 candidates/parcel-104/manifest.json
现在计算实际归档的摘要:
sha256sum candidates/parcel-104/guide.tar.gz
第一个字段必须与已验证清单中的摘要相符。后面打印的文件名不属于摘要。
之前查看过的已改动归档也有真实签名的清单,但它当前的字节已不再与清单一致。先验证其清单,再比较两个摘要来确认这一点:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-103/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-103/manifest.json
jq -r .sha256 candidates/parcel-103/manifest.json
sha256sum candidates/parcel-103/guide.tar.gz
签名通过,但摘要不同。应拒绝此包。现在有三个独立判断:可信签名者、请求的产品/版本,以及一致的归档字节。任一项失败,都意味着尚不能接收更新。
接收请求的交付包并保持线上指南不变
本步骤保存已验证且符合请求的交付包,以便交接。从 Workspace 的 /home/labex/project/waymark 目录开始。
accepted/ 已经存在。cp 复制文件;最后一个参数是目标目录。复制已验证的清单、签名包和归档:
cp candidates/parcel-104/manifest.json candidates/parcel-104/manifest.sigstore.json candidates/parcel-104/guide.tar.gz accepted/
复制后得到一组独立文件。请验证这组文件,不要假定先前的验证也适用于之后的副本:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle accepted/manifest.sigstore.json --insecure-ignore-tlog accepted/manifest.json
jq '.product, .version' accepted/manifest.json
jq -r .sha256 accepted/manifest.json
sha256sum accepted/guide.tar.gz
预期看到有效签名、event-guide、2.1,以及匹配的归档摘要。预先准备的只读自检使用这些实际文件、独立公钥/请求和预期指南内容:
python3 /opt/labex-waymark/verify.py selected
预期输出:
The accepted parcel is the independently signed, requested release with matching archive bytes.
如果失败,检查三个判断中的哪一个未通过,再从正确的原始交付包重复复制并重新验证副本。不要改动独立信任文件。检查不会替你选择交付包,也不会部署它。
切换到 Event Guide 并刷新页面。它仍应显示版本 2.0,Old Mill Walk 的集合时间仍应为 11:00。打开 Visitor notice,确认原来的实用建议仍在。本单元接收交付物以供交接;发布更新是下一单元教授的独立操作。
总结
你结合独立信任的发布者公钥、主办方要求的产品/版本以及实际归档的摘要,接收了真实签名的交付包。你还看到了为什么单凭旁附校验和、旧版本的有效签名,或放在已改动字节旁的签名清单,都不足以做出接收决定。
当前指南仍可使用。在下一个引导实验中,你将把这些判断写入可复用的接收脚本,确保只有已验证的归档字节进入运行中的指南。



