エラーメッセージ
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 システムは、存在しないシークレットを空文字列に展開します(たとえば、フォークからのプルリクエストの場合)。その結果、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 の ID(GitHub Actions の `id-token: write`)を使えば、管理すべき長期間有効な鍵やパスワードはありません。代わりに、検証者はワークフローの ID を固定します。
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