v2中文文档
项目

签名验证

构件签名可用于验证你拿到的构件是否与项目工作流生成的一致,以及是否被未授权方篡改(例如中间人攻击)。这能让所有参与方确认自己讨论的是同一个字节集合(可执行文件、SBOM、文本文件等)。

从Caddy v2.6.0开始,CI/CD发布产物使用项目的Sigstore体系进行签名。Sigstore签发的证书中包含签名主体信息。你可以先检查用于签名的证书。证书文件是base64编码的,先解码成PEM再查看。以下示例使用caddy_2.6.0_checksums.txt,并假设是类Linux环境。

先下载与目标构件相关的3个文件:

  • <artifact>:实际构件
  • <artifact>.sig:构件签名
  • <artifact>.pem:由Sigstore Fulcio体系签发的证书(base64编码)

先解码.pem

base64 -d < caddy_2.6.0_checksums.txt.pem > cert.pem

然后用openssl查看证书:

openssl x509 -in cert.pem -text

拿到证书后,可用cosign验证签名(注意这里使用未解码的.pem文件):

COSIGN_EXPERIMENTAL=1 cosign verify-blob --certificate ./caddy_2.6.0_checksums.txt.pem --signature ./caddy_2.6.0_checksums.txt.sig ./caddy_2.6.0_checksums.txt
tlog entry verified with uuid: 04deb84e5a73ba75ea69092c6d700eaeb869c29cae3e0cf98dbfef871361ed09 index: 3618623
Verified OK

接着可以用rekor-cli查询透明日志:

rekor-cli get --uuid 04deb84e5a73ba75ea69092c6d700eaeb869c29cae3e0cf98dbfef871361ed09 --format json | jq -r '.'

你会看到包含以下关键信息的JSON:

  • .Body.HashedRekordObj.signature.content:应与.sig内容一致
  • .Body.HashedRekordObj.signature.publicKey.content:应与.pem内容一致(base64形式)
  • .Body.HashedRekordObj.data.hash.value:应与构件sha256一致

也就是说,证书、签名、哈希三者都能在公开透明日志中相互印证。

验证构件真实性

如果你只有构件文件,没有签名和证书,也可先用rekor-cli按构件检索:

rekor-cli search --artifact ./caddy_2.6.0_checksums.txt --format json | jq -r '.UUIDs[0]'

再根据UUID取详情:

rekor-cli get --uuid 04deb84e5a73ba75ea69092c6d700eaeb869c29cae3e0cf98dbfef871361ed09 --format json | jq -r '.'

或一行命令完成:

rekor-cli get --uuid $(rekor-cli search --artifact ./caddy_2.6.0_checksums.txt --format json | jq -r '.UUIDs[0]') --format json | jq -r '.'

接下来,为确认“该签名确实来自Caddy项目的CI/CD工作流”,可从Rekor响应中提取证书并检查扩展字段:

rekor-cli get --uuid $(rekor-cli search --artifact ./caddy_2.6.0_checksums.txt --format json | jq -r '.UUIDs[0]') --format json | jq -r '.Body.HashedRekordObj.signature.publicKey.content' | base64 -d > cert.pem

然后:

openssl x509 -in cert.pem -text

检查X509v3 extensions中的workflow URI、repo、ref、commit等是否与预期一致。各OID定义可参考Sigstore OID信息

如果签名验证失败怎么办?

签名验证失败通常意味着:当前构件并非Caddy项目GitHub CI/CD工作流产物,或在构建发布到你拿到文件这条链路上被篡改。

如果你有签名、证书和构件,应以cosign成功验证为准。也可通过rekor-cli检查透明日志、比对证书扩展字段、签名与哈希是否一致。若Rekor中找不到记录或关键字段不一致,都应视为高风险信号。