Mensaje de error
decrypt: encrypted: decryption failed
También se muestra como
- Error: decrypt: encrypted: decryption failed
- Error: signing artifact.txt: reading key: decrypt: encrypted: decryption failed
El prefijo depende del comando, por ejemplo, «signing artifact.txt: reading key: decrypt: …» para `sign-blob`. Un `COSIGN_PASSWORD` vacío se usa como contraseña, no como «pregúntame».
Qué significa
Las claves privadas de cosign (`cosign.key`, etiqueta `ENCRYPTED SIGSTORE PRIVATE KEY`) se cifran con una contraseña mediante scrypt y secretbox. cosign leyó la contraseña de `COSIGN_PASSWORD` o de la solicitud interactiva, y el descifrado falló: la contraseña no es la que se usó al generar la clave. El archivo de la clave en sí está intacto; no se firmó nada.
Por qué ocurre
COSIGN_PASSWORD contiene otro secreto
frecuenteVarias claves de firma con contraseñas distintas, o un secreto renombrado en la CI mientras el secreto de la clave seguía siendo el mismo.
COSIGN_PASSWORD está definida pero vacía
frecuenteLos sistemas de CI expanden los secretos que faltan a una cadena vacía (por ejemplo, en los pull requests desde forks). Entonces cosign prueba la contraseña vacía en lugar de pedirla.
La clave se regeneró con una contraseña nueva
ocasionalAl volver a ejecutar `cosign generate-key-pair` se sobrescribió la clave, mientras que la contraseña guardada corresponde a la anterior.
Cómo solucionarlo
- 1.
Proporcionar la clave y la contraseña desde la misma fuente
Guarda ambas como secretos del mismo entorno y pasa la clave mediante `env://` para que no puedan desincronizarse.
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.
Valorar la firma keyless en la CI
Con una identidad OIDC (`id-token: write` en GitHub Actions) no hay ninguna clave de larga duración ni contraseña que gestionar; en su lugar, los verificadores fijan la identidad del flujo de trabajo.
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