Ctrl K
ComunidadGuías…

docs/android-dev-key.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# DEVELOPMENT signing key — this is not the release key

Generated on 2026-09-05 **on this VPS**, at the operator's request: he had no
access to his laptop and needed to unblock on-device verification.

File: `data/android-dev-signing/servercontrolpanel-DEV-NOT-RELEASE.jks`
(outside git — `.gitignore:12` covers `/data/`; mode `600`).

## Why this key can never become the release key

It was born on a **public** host. The release key has to survive a compromise of
this server — that is the entire reason `docs/android-signing-keystore.md`
requires generating it offline. This one does not survive: whoever takes over
the VPS can read it.

It is disposable **by construction**, not by agreement:

| | dev (this one) | release (future) |
|---|---|---|
| file | `servercontrolpanel-DEV-NOT-RELEASE.jks` | `servercontrolpanel-release.jks` |
| alias | `servercontrolpanel-dev` | `servercontrolpanel` |
| CN | `... (DEV - NOT RELEASE)` | `tech.northwind.servercontrolpanel` |
| validity | 3650 days | 10000 days |
| password | `example-not-a-secret` — **not a secret** | only in the operator's password manager |

The password is public on purpose, like the `android` password of the SDK's own
debug keystore. It does not go into the vault: keeping the password of a
disposable key in the vault only teaches people to treat the vault as a junk
drawer.

## SHA-256 fingerprint

```
00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF
```

(Placeholder value — the real fingerprint of this development key is not
published here.)

It is already in `data/config.json` under `android_signing_fingerprints`, which
is a **list**. `/.well-known/assetlinks.json` serves every entry, so adding the
real key later **does not require removing this one** — during the transition,
devices signed with either key keep working passkeys.

## What it is good for

Exactly what was blocked for lack of a key — all on-device verification:

- installing on a phone and actually using the app
- the terminal memory soak test, still open
- the matrix of IME, physical keyboard, Doze, and notifications with the app
  killed
- end-to-end passkey login (`assetlinks.json` already serves this fingerprint)
- video call interop with the web client

## What it is NOT good for

- **Registering this fingerprint with Android Developer Verification.** The
  registration binds certificate + package name permanently. Registering the dev
  one means the real key could never be used with `tech.northwind.servercontrolpanel`.
- **Publishing an APK signed with it in the F-Droid repository.** Whoever
  installs it is stuck with this key — an F-Droid update requires the same
  signature. Switching later forces an uninstall and reinstall on every device.

Testing: yes. Distributing or registering: no.

## How to replace it with the real one

1. Generate the real one offline (`docs/android-signing-keystore.md` §3).
2. **Add** the real fingerprint to the list in `data/config.json` — without
   removing this one yet.
3. Sign and publish the release with the real key.
4. Only once every device is running a build signed with the real key: remove
   this fingerprint and delete `data/android-dev-signing/`.

The order matters. Removing the dev one before devices migrate breaks their
passkeys **silently** — `assetlinks.json` stops listing the signature they have,
and the system simply stops associating them.