Every plugin the agent installs is signed by an Ed25519 key the agent trusts. This page covers the publisher-side lifecycle: generation, registration, rotation, revocation, and storage.Documentation Index
Fetch the complete documentation index at: https://docs.altnautica.com/llms.txt
Use this file to discover all available pages before exploring further.
Why Ed25519
Small keys (32 bytes), small signatures (64 bytes), constant-time verification, no parameter choices to misconfigure. The same algorithm signs OTA payloads, so the agent’s verifier already exists and is well-tested. There is no algorithm choice to make.Generate a key
publisher.pem) is what sign.sh reads. The
public hex (publisher.pub.hex) is what you paste into the registry
and what operators add to their local trust list for self-signed
deployments.
Pick a key id
The signer key id is a short label baked into the archive’sSIGNATURES file. Operators see it on the install dialog; the
revocation list keys off it. Format guidelines:
- Use the publisher’s namespace prefix.
- Add a year or generation suffix.
- Keep it stable across the key’s lifetime.
Register the key with the registry
Once per key. The registry needs the public half so it can verify your submitted archives. See Submitting to the registry for the REST and web flows. A registered key has:key_idpublic_key_hexvalid_from,valid_to- A SHA-256 fingerprint shown on operator install dialogs
Trust list on the agent
Two YAML files under/etc/ados/keys/ are the agent’s trust source.
plugin-keys.yaml ships in the agent’s signed image and updates
through OTA. It contains the public keys for first-party Altnautica
signing plus any vetted partner keys.
plugin-keys.local.yaml is empty by default. Operators add their
own keys here for self-signed plugins on closed deployments. Format:
CLI helper
The agent CLI wraps the local trust list:add writes into plugin-keys.local.yaml with default validity
(now plus 24 months). Override with --valid-from and --valid-to.
Rotation
Keys are valid for at most 24 months. Plan rotations with overlap so plugins signed by the previous key keep verifying through the transition.- Generate a new key pair.
- Register the new public key with the registry (or distribute it
to your fleet’s
plugin-keys.local.yamlfor closed deployments). - Push out the new trust list. For Altnautica’s hosted registry
that is automatic via OTA. For self-host, distribute the updated
plugin-keys.local.yamlvia your config-management channel. - Start signing new releases with the new key.
- The old key keeps verifying older plugins through its
valid_to. - After
valid_toexpires, drop the old key from the trust list.
Revocation
If a key is compromised:- Add the key id to the revocation list.
- Push the revocation list. The Altnautica registry serves it at
https://registry.ados.altnautica.com/v1/revoked.jsonand agents poll daily. Self-host runs the same endpoint shape on your internal registry. - Re-sign current plugin versions with a fresh key.
- Notify operators. New installs of any plugin signed by the revoked key fail with a clear error. Already-installed plugins keep running but raise a critical warning on every start.
Hardware-backed storage (recommended)
For production publisher keys, store the private key in a hardware security module. Options:- A dedicated HSM appliance (PKCS#11 interface).
- A YubiKey 5 with PIV applet (limited Ed25519 support; verify your firmware version).
- A TPM 2.0 with the key sealed to the platform.
sign.sh calls into the PKCS#11 module to compute the signature
without ever exporting the private key.
For developer iteration, file-on-disk is fine. Pin tight file
permissions:
altnautica/ADOSExtensions carries a .gitignore that
covers keys/*.pem.
CI signing
GitHub Actions stores the key in a secret and the signer reads it inline:ADOS_SIGNING_KEY_INLINE=1 tells sign.sh to treat
ADOS_SIGNING_KEY as a base64 PEM body rather than a file path.
Hold the secret in GitHub Environments with required reviewers if
the key is high-value.
Self-signed for closed deployments
Closed deployments (fleets that never pull from the public registry) sign and trust end to end without Altnautica involvement:- Generate a key pair locally.
- Bake the public key into the agent image you ship to your fleet,
in
plugin-keys.local.yaml. - Sign your plugins with the matching private key.
- Distribute via internal HTTPS, USB, or your existing fleet channel.