Fehlermeldung
decrypt: encrypted: decryption failed
Auch ausgegeben als
- Error: decrypt: encrypted: decryption failed
- Error: signing artifact.txt: reading key: decrypt: encrypted: decryption failed
Das Präfix hängt vom Befehl ab, bei `sign-blob` zum Beispiel „signing artifact.txt: reading key: decrypt: …“. Ein leeres `COSIGN_PASSWORD` wird als Passwort verwendet, nicht als Aufforderung, nach dem Passwort zu fragen.
Was der Fehler bedeutet
Private Schlüssel von cosign (`cosign.key`, Label `ENCRYPTED SIGSTORE PRIVATE KEY`) sind mit einem Passwort über scrypt und secretbox verschlüsselt. cosign hat das Passwort aus `COSIGN_PASSWORD` oder über die Eingabeaufforderung gelesen, und die Entschlüsselung ist fehlgeschlagen – das Passwort ist nicht das, mit dem der Schlüssel erzeugt wurde. Die Schlüsseldatei selbst ist intakt; es wurde nichts signiert.
Warum der Fehler auftritt
COSIGN_PASSWORD enthält ein anderes Secret
häufigMehrere Signaturschlüssel mit unterschiedlichen Passwörtern oder ein in der CI umbenanntes Secret, während das Secret mit dem Schlüssel unverändert blieb.
COSIGN_PASSWORD ist gesetzt, aber leer
häufigCI-Systeme ersetzen fehlende Secrets durch einen leeren String (zum Beispiel bei Pull Requests aus Forks). cosign probiert dann das leere Passwort, statt nachzufragen.
Der Schlüssel wurde mit einem neuen Passwort neu erzeugt
gelegentlichEin erneuter Aufruf von `cosign generate-key-pair` hat den Schlüssel überschrieben, während das gespeicherte Passwort zum vorherigen gehört.
So behebst du den Fehler
- 1.
Schlüssel und Passwort aus derselben Quelle bereitstellen
Speichere beides als Secrets derselben Umgebung und übergib den Schlüssel über `env://`, damit die beiden nicht auseinanderlaufen können.
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.
Schlüsselloses Signieren in der CI erwägen
Mit einer OIDC-Identität (GitHub Actions `id-token: write`) gibt es keinen langlebigen Schlüssel und kein Passwort zu verwalten; Verifizierer legen stattdessen die Identität des Workflows fest.
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