Sigstore cosign (sign, sign-blob, attest, public-key with --key cosign.key)其他工具
错误信息
decrypt: encrypted: decryption failed
也可能输出为
- Error: decrypt: encrypted: decryption failed
- Error: signing artifact.txt: reading key: decrypt: encrypted: decryption failed
前缀取决于命令,例如 `sign-blob` 的前缀是“signing artifact.txt: reading key: decrypt: …”。空的 `COSIGN_PASSWORD` 会被当作密码本身使用,而不表示“提示我输入”。
含义
cosign 私钥(`cosign.key`,标签为 `ENCRYPTED SIGSTORE PRIVATE KEY`)通过 scrypt 和 secretbox 用密码加密。cosign 从 `COSIGN_PASSWORD` 或交互提示中读取了密码,但解密失败——这个密码不是生成密钥时使用的那个。密钥文件本身完好无损;没有对任何内容签名。
原因
COSIGN_PASSWORD 中存放的是另一个机密
常见有多个签名密钥,各自的密码不同;或者 CI 中的某个机密被重命名了,而存放密钥的机密没有变。
设置了 COSIGN_PASSWORD,但值为空
常见CI 系统会把不存在的机密展开为空字符串(例如在来自复刻仓库的 pull request 中)。于是 cosign 会尝试使用空密码,而不是提示输入。
密钥已用新密码重新生成
偶见再次运行 `cosign generate-key-pair` 覆盖了密钥,而保存的密码仍属于之前的那个密钥。
修复方法
- 1.
从同一来源提供密钥和密码
把两者都存为同一环境中的机密,并通过 `env://` 传入密钥,这样它们就不会彼此脱节。
yaml # GitHub Actions: key and its password from the same secret store - name: Sign env: COSIGN_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }} COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }} run: cosign sign-blob --yes --key env://COSIGN_KEY --bundle dist/app.sigstore.json dist/app.tar.gz - 2.
考虑在 CI 中使用无密钥签名
使用 OIDC 身份(GitHub Actions 的 `id-token: write`)时,没有需要管理的长期密钥或密码;验证方改为固定工作流身份。
yaml # Or drop the long-lived key: keyless signing with the workflow's OIDC identity permissions: id-token: write steps: - run: cosign sign-blob --yes --bundle dist/app.sigstore.json dist/app.tar.gz