Skip to content

Sign with a new key, and say so where it matters - #48

Merged
aquasolterra merged 2 commits into
mainfrom
security-signing-fingerprint
Sep 4, 2026
Merged

Sign with a new key, and say so where it matters#48
aquasolterra merged 2 commits into
mainfrom
security-signing-fingerprint

Conversation

@aquasolterra

Copy link
Copy Markdown
Member

The released key was the one Android generates for debug builds, moved out of
~/.android/debug.keystore and used for real releases since the first one — so
every APK published here carries a certificate reading CN=Android Debug. It is
cryptographically sound (RSA 2048, SHA-256, valid to 2055) and the name is only
a label, but it is a label that reads as something the build is not, and the
label cannot be edited: Android identifies a signer by the whole certificate, so
a new name is a new identity either way. Verified rather than assumed, on a copy
of the CI keystore: keytool -selfcert with a new -dname over the same key
pair moves the fingerprint.

So it is replaced now, while the users it inconveniences are few and before an
F-Droid submission pins the old fingerprint in fdroiddata, where changing it
later would cost every install from there as well. RSA 4096, PKCS12, valid 50
years, CN=Pappus Travel Planner, O=Calyptra Software, C=DE, fingerprint
5bb5d791…; the old key is kept, since it is the only thing that can still verify
the releases up to 1.10.0.

The cost is real and lands on the user: Android refuses the new build as an
update, so this release has to be installed fresh. The changelog therefore leads
with the export rather than mentioning it, names the two menu items exactly, and
says what the file contains — the attachments live in the database, so it is one
file and it can be large.

SECURITY.md now carries both fingerprints with the version boundary rather than
claiming one key, and explains the old certificate's name, since somebody
following the instruction to check an older APK will read Android Debug and
would otherwise be right to report it.

The workflow needs no change for any of this: the four secrets were replaced and
the dry run signed all three ABIs with the new key.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

aquasolterra and others added 2 commits September 4, 2026 23:06
The released key was the one Android generates for debug builds, moved out of
~/.android/debug.keystore and used for real releases since the first one — so
every APK published here carries a certificate reading `CN=Android Debug`. It is
cryptographically sound (RSA 2048, SHA-256, valid to 2055) and the name is only
a label, but it is a label that reads as something the build is not, and the
label cannot be edited: Android identifies a signer by the whole certificate, so
a new name is a new identity either way. Verified rather than assumed, on a copy
of the CI keystore: `keytool -selfcert` with a new `-dname` over the same key
pair moves the fingerprint.

So it is replaced now, while the users it inconveniences are few and before an
F-Droid submission pins the old fingerprint in fdroiddata, where changing it
later would cost every install from there as well. RSA 4096, PKCS12, valid 50
years, `CN=Pappus Travel Planner, O=Calyptra Software, C=DE`, fingerprint
5bb5d791…; the old key is kept, since it is the only thing that can still verify
the releases up to 1.10.0.

The cost is real and lands on the user: Android refuses the new build as an
update, so this release has to be installed fresh. The changelog therefore leads
with the export rather than mentioning it, names the two menu items exactly, and
says what the file contains — the attachments live in the database, so it is one
file and it can be large.

SECURITY.md now carries both fingerprints with the version boundary rather than
claiming one key, and explains the old certificate's name, since somebody
following the instruction to check an older APK will read `Android Debug` and
would otherwise be right to report it.

The workflow needs no change for any of this: the four secrets were replaced and
the dry run signed all three ABIs with the new key.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The process existed only as a workflow file and a conversation: the tag has to
match `pubspec.yaml`, the build number has to climb, the release arrives as a
draft, and the fingerprint in the job summary is the thing to check before
publishing. None of that is guessable from the outside, and the failure it
guards against is quiet — a mistyped secret produces perfectly good APKs signed
with the wrong key.

CONTRIBUTING.md carries the steps, next to the section that already explains why
a build from source will not install over a released one, since both are about
the same fact. AGENTS.md gets the short version in the build-constraints
section, where an agent looks for how this repository is built, and states the
rule that matters there: never build and upload a release artifact by hand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@codecov

codecov Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@aquasolterra
aquasolterra merged commit 4275c26 into main Sep 4, 2026
3 checks passed
@aquasolterra
aquasolterra deleted the security-signing-fingerprint branch September 4, 2026 21:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant