From 71f6a70829440f16c27471598dcd1763874da2d7 Mon Sep 17 00:00:00 2001 From: Harald Date: Tue, 6 Oct 2026 21:04:54 +0200 Subject: [PATCH] fix(ci): Release-Signatur mit rsign2 statt minisign-CLI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Signaturschlüssel wurde mit `rsign generate -W` erzeugt und ist mit leerem Passwort verschlüsselt; das minisign-CLI aus Ubuntu (0.11) verlangt dafür ein Terminal und brach in der CI mit "Error while loading the secret key file" ab. - Workflow installiert rsign2 0.6.7 (ohne -D warnings) statt minisign - build-release.sh signiert und verifiziert mit rsign; da rsign bei falscher Key-ID mit Exit-Code 0 endet, wird zusätzlich die Erfolgsmeldung geprüft - README: Signierwerkzeug und Fallstrick dokumentiert Co-Authored-By: Claude Opus 5.5 --- .gitea/workflows/release.yaml | 5 ++++- README.md | 8 ++++---- scripts/build-release.sh | 22 ++++++++++++++++++---- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index 11301f8..d6a553c 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -38,7 +38,6 @@ jobs: squashfs-tools \ dpkg-dev \ curl \ - minisign \ python3 - name: Setup Rust Toolchain @@ -50,6 +49,10 @@ jobs: components: rustfmt, clippy cache: true + - name: Install rsign2 (Release-Signatur) + # RUSTFLAGS leeren: die Toolchain-Action setzt -D warnings, das soll nicht für rsign2 gelten + run: RUSTFLAGS="" cargo install rsign2 --locked --version 0.6.7 + - name: Code Quality & Testing (Quality Gates) run: | cargo fmt --check diff --git a/README.md b/README.md index 27eee77..38c4785 100644 --- a/README.md +++ b/README.md @@ -88,19 +88,19 @@ Ergebnis in `target/`: ### Release-Signatur einrichten (einmalig) -In-App-Updates werden nur mit gültiger Minisign-Signatur installiert. Einmalig ein Schlüsselpaar erzeugen (ohne Passwort, da es nur als CI-Secret verwendet wird): +In-App-Updates werden nur mit gültiger Minisign-Signatur installiert. Signiert wird mit [rsign2](https://crates.io/crates/rsign2), einer Minisign-kompatiblen Implementierung (`cargo install rsign2 --locked`). Einmalig ein Schlüsselpaar erzeugen (ohne Passwort, da es nur als CI-Secret verwendet wird): ```bash -minisign -G -W -p ink-notes.pub -s ink-notes.key -# oder ohne minisign-Paket, mit dem kompatiblen rsign2 (cargo install rsign2): rsign generate -W -p ink-notes.pub -s ink-notes.key ``` +> **Wichtig:** Schlüssel und Signierwerkzeug müssen zusammenpassen. `rsign generate -W` verschlüsselt den Schlüssel mit einem leeren Passwort; das `minisign`-CLI (z. B. Ubuntu-Paket 0.11) kann ihn ohne Terminal nicht laden. `build-release.sh` und die CI signieren deshalb mit `rsign`. + 1. Die zweite Zeile aus `ink-notes.pub` (beginnt mit `RW`) in `src/updater.rs` als `UPDATE_SIGNING_PUBLIC_KEY` eintragen und committen. 2. Den kompletten Inhalt von `ink-notes.key` in Gitea unter *Repository → Einstellungen → Actions → Secrets* als `MINISIGN_SECRET_KEY` anlegen. 3. `ink-notes.key` sicher offline aufbewahren und vom Rechner löschen. Geht der Schlüssel verloren, können bestehende Installationen keine Updates mehr prüfen. -Lokal signiert `build-release.sh` nur, wenn `MINISIGN_SECRET_KEY` gesetzt ist. In der CI ist die Signatur Pflicht (`INK_NOTES_REQUIRE_SIGNATURE=1`), und das Skript prüft, dass der geheime Schlüssel zum eingebauten öffentlichen Schlüssel passt. +Lokal signiert `build-release.sh` nur, wenn `MINISIGN_SECRET_KEY` gesetzt und `rsign` installiert ist. In der CI ist die Signatur Pflicht (`INK_NOTES_REQUIRE_SIGNATURE=1`), und das Skript prüft, dass der geheime Schlüssel zum eingebauten öffentlichen Schlüssel passt. ### 2. Installation auf Zorin OS 18 / Ubuntu 24.04 diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 1ceb4ba..0d74eef 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -30,7 +30,9 @@ echo "=== Berechne SHA256-Prüfsummen in target/${CHECKSUM_FILE} ===" cd "${ROOT_DIR}/target" sha256sum "${DEB_NAME}" "${APPIMAGE_NAME}" > "${CHECKSUM_FILE}" -# 4. Prüfsummen mit Minisign signieren (Pflicht für In-App-Updates) +# 4. Prüfsummen signieren (Pflicht für In-App-Updates) +# Signiert wird mit rsign2 (minisign-kompatibles Format): Der Schlüssel wurde mit +# `rsign generate -W` erzeugt; das minisign-CLI kann ihn ohne Terminal nicht laden. SIGNATURE_FILE="${CHECKSUM_FILE}.minisig" rm -f "${SIGNATURE_FILE}" # Schlüssel kann von rustfmt in die Folgezeile umgebrochen sein @@ -40,14 +42,26 @@ if [ -n "${MINISIGN_SECRET_KEY:-}" ]; then echo "FEHLER: UPDATE_SIGNING_PUBLIC_KEY in src/updater.rs ist leer – diese Version könnte keine Updates prüfen." exit 1 fi - echo "=== Signiere ${CHECKSUM_FILE} mit Minisign ===" + if ! command -v rsign >/dev/null 2>&1; then + echo "FEHLER: rsign nicht gefunden (Installation: cargo install rsign2 --locked)." + exit 1 + fi + echo "=== Signiere ${CHECKSUM_FILE} mit rsign2 ===" KEY_FILE="$(mktemp)" trap 'rm -f "${KEY_FILE}"' EXIT printf '%s\n' "${MINISIGN_SECRET_KEY}" > "${KEY_FILE}" - minisign -S -s "${KEY_FILE}" -m "${CHECKSUM_FILE}" -t "ink-notes v${VERSION}" + rsign sign -W -s "${KEY_FILE}" -t "ink-notes v${VERSION}" -x "${SIGNATURE_FILE}" "${CHECKSUM_FILE}" rm -f "${KEY_FILE}" # Stellt sicher, dass der geheime Schlüssel zum eingebauten öffentlichen Schlüssel passt - minisign -V -P "${EMBEDDED_PUBKEY}" -m "${CHECKSUM_FILE}" + # rsign beendet sich bei falscher Key-ID mit Exit-Code 0, daher zusätzlich die Meldung prüfen + if ! VERIFY_OUT=$(rsign verify -P "${EMBEDDED_PUBKEY}" -x "${SIGNATURE_FILE}" "${CHECKSUM_FILE}" 2>&1) \ + || ! grep -q "Signature and comment signature verified" <<<"${VERIFY_OUT}"; then + echo "${VERIFY_OUT}" + echo "FEHLER: Signatur passt nicht zum eingebauten öffentlichen Schlüssel (UPDATE_SIGNING_PUBLIC_KEY)." + rm -f "${SIGNATURE_FILE}" + exit 1 + fi + echo "${VERIFY_OUT}" elif [ "${INK_NOTES_REQUIRE_SIGNATURE:-0}" = "1" ]; then echo "FEHLER: MINISIGN_SECRET_KEY ist nicht gesetzt, eine Signatur ist aber Pflicht." exit 1