Skip to content

docs(ops): add DID domain and key custody notes - #542

Merged
LKSNDRTMLKV merged 2 commits into
mainfrom
docs/runbook-did-web-and-custody
Oct 29, 2026
Merged

LKSNDRTMLKV merged 2 commits into
mainfrom
docs/runbook-did-web-and-custody

Conversation

@LKSNDRTMLKV

Copy link
Copy Markdown
Member

What

Two additions to the production runbook, both stating what the node does today and nothing it does not.

The DID domain is a trust root. A passport verifies against the operator's did:web document, fetched over HTTPS from the operator's domain, and the resolver caches it for five minutes. Whoever controls the domain's DNS or TLS endpoint controls which keys verify. The node does not detect a changed document. The section lists the operator-side controls (registrar lock and two-factor sign-in, DNSSEC, CAA records, recording the key thumbprints after each rotation and comparing on a schedule).

Key custody. What protects the signing key while the node runs: an AES-256-GCM key store with an Argon2id-derived key, the passphrase read only from the KEY_STORE_PASSPHRASE environment variable, the decrypted key held in process memory, and no hardware-backed or remote-signer option. So anyone who can read the node's environment holds the passphrase; the section says to keep .env at mode 0600, out of version control and out of backups that leave the host.

Checked against the code

  • Cache TTL: DID_DOC_CACHE_TTL (300 s) in dpp-resolver/src/infra/did.rs.
  • Key store: dpp-crypto keystore (AES-256-GCM, Argon2id); passphrase read from the environment in the identity and node configs.
  • No pkcs11, HSM or KMS signer anywhere in the crates.

Not done

No KEY_STORE_PASSPHRASE_FILE variant exists, so the runbook does not recommend delivering the passphrase by secret file. That would be a code change and its own PR.

Gates

Docs only. Run locally: debug-check, no-rsa-private-key, vocabulary-check, subjects-check, mod-rs-check, harness-check, outbound-check, spec-version-check, cargo fmt --check: all green. Not run locally: clippy, tests and the audit, since the diff touches no code; CI runs the full gate.

@LKSNDRTMLKV LKSNDRTMLKV added documentation Improvements or additions to documentation surface/docs-only Contained to documentation; no code depends on it labels Oct 29, 2026
@LKSNDRTMLKV
LKSNDRTMLKV merged commit 631a538 into main Oct 29, 2026
26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation surface/docs-only Contained to documentation; no code depends on it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant