Signotaur stores a number of sensitive values (passwords, secrets and private-key passphrases) that it needs at runtime but must never expose in plaintext on disk. This page explains how those secrets are protected at rest and what changes in version 2. It also covers how the protection is tied to the machine it was created on, and how to recover or migrate when something goes wrong.
Every secret Signotaur persists is encrypted with a single AES master key (and initialization vector). The following values are all protected this way:
.pwd files (each is AES-encrypted under the master key)..sigbak archives.In earlier versions, the AES master key and vector lived in plaintext in the Signotaur.Server.config.json configuration file. Anyone who copied the data folder held the key to every secret in it.
In version 2, the master key and vector are themselves sealed with DPAPI at machine scope (DataProtectionScope.LocalMachine). The plaintext key and vector no longer rest on disk; only the DPAPI-sealed form does, and only that specific machine can unseal it.
Key points:
DPAPI1: prefix so the server can tell sealed from unsealed and never double-seals.DPAPI machine-scope sealing binds the master key to the local machine. You cannot hand-copy the configuration file, keys, or data folder to another host and expect the secrets to decrypt there. The destination machine cannot unseal a key that was sealed on a different machine. The danger note in the configuration file reference about "copying the Key and Vector to migrate" applies only to pre-version-2 behaviour; in version 2 you must migrate using the archive command (below).
Because the master key is bound to the machine that sealed it, moving Signotaur to a new server (or recovering onto a reimaged or reinstalled one) must go through the server archive command rather than a file copy.
To migrate, run archive create on the source host to produce a passphrase-encrypted .sigbak bundle, copy that bundle to the destination, then run archive restore on the destination host. Restore re-seals the master key under the destination machine's DPAPI, so all secrets, certificates and database content decrypt correctly on the new machine. See the archive command for full usage.
A .sigbak bundle carries the master key in a passphrase-wrapped form (not DPAPI-sealed), so it is portable between machines; everything else in the bundle stays encrypted exactly as it was stored. The re-sealing happens only on the destination during restore.
If the master key cannot be unsealed (for example because the configuration was copied from another host, DPAPI is broken, or the machine has been reimaged) Signotaur fails closed rather than silently producing garbage:
archive restore on the new host.The server exposes a health flag, MasterKeyProtectedAtRest, which is true only when the master key is actually sealed at rest, along with an unseal-error state used to drive the status badges described next.
If the server reports that secrets cannot be decrypted or you see the red "Encryption unavailable" badge, choose the path that matches your situation:
archive create to migrate correctly.archive restore on the new host. If you are intentionally moving to a new or reinstalled machine, restore a .sigbak created on the source with archive restore; this re-seals the key under the destination's DPAPI. See the archive command..sigbak is available, the encrypted secrets are unrecoverable. Reset the encryption configuration and re-enter every secret (OAuth client secrets, SMTP password, ADCS password, web-certificate PFX passwords, and the backup passphrase) from scratch.