Skip to main content
Version: v0.25.0 (Latest)

Secrets and KMS providers

Two products sit next to each other in the resource rail and solve different problems. Secrets holds opaque credentials: SMTP passwords, API keys, vault tokens, the material an integration needs to authenticate. Key Management holds cryptographic key stores: the private keys that sign tokens, credentials, status lists and DID proofs.

The distinction matters when something breaks. A failing SMTP login is a secrets problem. A failing JWT signature is a KMS problem. Treating both screens as one pile of crypto settings is where most misdirected debugging starts.

They touch in two places. A software KMS keystore is unlocked with a password that can be stored as a secret, and cloud KMS credentials can be staged through write-only secret fields. Neither makes Secrets the place to look when a signature fails.

Audience: platform operators for platform storage, shared providers and tenant policy; tenant administrators for their own assignment, migrations and key stores.

Prerequisites: a platform with an active license exposing both products, and at least one tenant from Onboard a tenant. Real Vault or cloud backends need network paths and credentials that exist outside the browser.

What you find on these screens depends on onboarding. A lab tenant often has environment secret storage and a product-managed software KMS already. A clean production tenant shows empty lists until someone attaches something, and empty is usually "not provisioned yet" rather than broken.

How secret management is layered​

Secret management has three layers, arranged so a platform credential never reaches a tenant UI.

A provider definition is the real backend: a Vault address, an AWS account, an Azure vault, the deployment environment, or a KMS-backed store. Definitions carry revisions. Credentials are staged write-only, tested, preflighted, then marked ready, and health comes from probes rather than from whoever filled in the form.

An offering is the tenant-facing face of a platform definition, and only the platform creates them. Tenants see a display name, capabilities, isolation mode and whether migration is allowed. They never see the definition id, the physical locator, or the platform's vault token. The isolation mode is the contract that keeps one tenant from reading another's material on a shared backend.

An assignment is the tenant's current secret backend, and exactly one is active at a time. Every piece of product code that creates a secret handle or resolves an SMTP password goes through it. When the assignment is wrong or missing, forms still open and validate, and the failure appears later at send time.

Platform storage is the same idea applied to the platform itself, for bootstrap secrets and platform-operated integrations. Keep it under platform control; pointing it at a customer-controlled vault mixes two trust boundaries that should stay apart.

Why nothing is ever shown back​

The console never displays a secret value after submit, and there is no reveal control. Browser history, screen shares and support screenshots must not be able to recover a production password. Rotation stages a new value instead, and a blank field on a rotate form means keep the current one; clearing a secret is a separate confirmed action.

Mutations use If-Match with a strong ETag, so two operators editing the same assignment or policy get a conflict rather than one silently overwriting the other. If you need a value again, you rotate or re-stage it.

Isolation modes​

Isolation mode is part of an offering's published contract and describes how the backend separates tenants. On a shared Vault or a single cloud account this is a data-risk decision rather than a preference.

ModeWhat it means
tenant-keyPer-tenant cryptographic separation or keying material
tenant-namespace, tenant-vaultPath or mount isolation inside one control plane
tenant-policy, tenant-roleAccess controlled per tenant through IAM or policy attachment
read-only-deploymentValues come from the deployment; console writes are disabled

Tenant policy can require backend-enforced isolation, which refuses offerings that do not meet the bar. Policy cannot create isolation a backend does not implement; it can only decline to use one.

Secret storage, tenant and platform​

1

Read the tenant's active assignment

GET /api/platform/config/v1/tenants/00000000-0000-4000-8000-000000000000/secrets/assignment200 OK

Resources > Secrets > Storage shows the one active assignment: display name, provider type, lifecycle state, and whether it came from a platform offering or a tenant-managed provider. The captured tenant uses a platform offering, which source reports as platform-offering.

version is the value a conditional write needs. Read before you write.

Switching assignment is not a rename. Moving between backends is a migration with copy, validation and cutover phases, driven from the Provider and Migrations tabs rather than by editing configuration directly.

Read the tenant's active assignment
2

See what this tenant is permitted to use

GET /api/platform/config/v1/tenants/00000000-0000-4000-8000-000000000000/secrets/options200 OK

The options call bundles two things: the policy in force for this tenant, and the offerings it may adopt. Resources > Secrets > Provider renders both.

effectivePolicy is the merged result of the global policy and any override attached to this tenant, so read it here rather than inferring it from the platform screen. permittedOfferings lists migration targets, not a multi-select. usageState distinguishes the offering backing the current assignment from ones merely available, and migrationBlockedReason says why a move is refused: already selected, a migration already in progress, the offering disabled, or policy denying it.

Who rotates credentials follows from the source. Platform offerings rotate on the platform side. Tenant-managed providers rotate here, through write-only fields, and the tenant carries the duty to monitor health and keep network access working.

See what this tenant is permitted to use
3

Check the platform's own storage

GET /api/platform/admin/v1/application/secrets/storage200 OK

Switch the tenant picker to platform and Storage shows the platform's assignment. The captured deployment uses environment storage with readOnly: true, which is normal in a packaged deploy: values come from deployment configuration, and the console disables writes because the right place to change them is the deployment.

Change storage exists for the deliberate move of platform secrets into Vault or a cloud secret manager. Keep whatever you choose under platform control.

Check the platform's own storage
4

List the published offerings

GET /api/platform/admin/v1/application/secrets/offerings200 OK

Resources > Secrets > Shared providers on the platform tenant is where operators build the backends tenants consume. Creating one walks through choosing a type, staging write-only credentials, testing connectivity, preflighting capability and isolation, and marking it ready before publishing.

The offerings list carries isolationMode, enabled, and assignmentCount. That count is the blast radius: rotating this definition's credentials without testing first can fail secret resolution for every one of those tenants at once.

Disabling an offering stops new adoption while leaving existing assignments in place until those tenants migrate away. That is how a shared vault gets wound down without deleting definitions during an incident.

List the published offerings

Tenant policy is the rulebook every tenant inherits. allowTenantManagedProviders decides whether tenants may attach their own Vault or cloud store at all; turning it off gives you one operated estate. allowPlatformOfferings is the mirror image and is rarely turned off outside a lockdown. requireBackendIsolation refuses offerings that do not meet the isolation bar, allowedProviderTypes keeps surprise backends out of a regulated deployment, and retentionDays bounds how long a migration may keep the old backend available for rollback.

Overrides attach a complete policy to a single tenant, for a customer whose contract differs. Prefer a tight global policy with few overrides. A global policy that allows every type and unrestricted tenant-managed providers is the most flexible and also the largest incident blast radius.

Tenant secret policy on the platform tenant

Migrating between backends​

A migration moves secret material without a single unrecoverable write. Preflight checks connectivity, capability and isolation, and produces a short-lived token. Copy writes the material to the destination while readers still use the old backend. Validation checks the destination, and only then does cutover point the assignment at it. The old backend stays available for rollback for the retention days the policy allows, until it is purged.

Resume continues a paused or recoverable step. Rollback returns to the retained source while retention still holds it. Purge is the permanent removal of that source, and it is the one step with no way back.

Do not purge on the first good day after cutover. Wait until the real consumers, email, connectors and any KMS credential references, have run against the new assignment under load. An empty migrations list means nothing is in flight, which is the normal state.

Choosing a secrets backend​

Environment storage takes deploy-time values and is usually read-only in the console, which suits labs and fixed platform bootstrap. HashiCorp Vault works as either a shared or a tenant-operated engine, and its isolation mode and mount layout are what make it safe for multiple tenants. AWS Secrets Manager and Azure Key Vault bring their own credential ownership and IAM alignment questions. A Kubernetes mount ties the lifecycle to the deployment rather than to anything rotatable from a browser. KMS-backed storage envelope-encrypts secrets through a KMS, and it is still a secrets assignment rather than a substitute for the key stores below.

Pick backends your operators can actually monitor. A Vault nobody can reach from the product network is worse than environment storage that is understood and covered by deployment process.

Key stores​

Key Management > Providers merges two planes onto one screen so operators do not maintain two menus. The management resource is the platform-config record: how the store is configured, who owns the credential, its version for conditional writes, and whether it can be shared, detached or retired. The runtime provider is what the KMS API exposes for generate and sign, addressed by providerId.

Ownership is a badge rather than a technology. A platform-shared software KMS and a tenant-owned AWS KMS both appear as providers; what differs is who owns the configuration and which actions are offered. The provider id is permanent after create, because keys, DID verification methods and service configuration all store it.

A cloud provider can also be declared by the deployment itself, through environment variables or Helm values, instead of being added here. Such a provider belongs to the platform tenant, shows up already configured, and refuses credential, reference, detach and retire actions because its configuration is the source of truth. Cloud KMS providers compares the two routes.

1

See what can be attached

GET /api/platform/config/v1/tenants/00000000-0000-4000-8000-000000000000/kms/offerings200 OK

The offerings call says which technologies this deployment permits. The captured response offers SOFTWARE only, which is a deployment with cloud kinds turned off, and supportedCredentialOwnerships says whether the product or the tenant supplies the credential for each kind.

Add KMS fixes several things at once. The technology locks the field set, a file keystore asking for different inputs than a cloud region and vault URL. Credential ownership decides which trust zone the secret lives in, and the wrong choice either blocks validation permanently or puts a credential somewhere it should not be. The provider id is immutable, so prefer something short and stable such as default or aws-prod. The display name is only a label and can be changed later.

For software storage the choice between memory and a keystore file is the one to get right: memory loses every key on restart, which is fine for a demo and never right for production.

See what can be attached
2

Read the configured resources

GET /api/platform/config/v1/tenants/00000000-0000-4000-8000-000000000000/kms/resources200 OK

Each resource carries its handle, provider id, state, resourceVersion and availableActions. Credentials come back redacted, since this is the browser-safe view.

availableActions is the honest answer to what this resource will accept. Setting a default changes where new keys are created and leaves existing keys on their original provider. Detaching removes the management association while the runtime may still hold references. Retiring ends the resource's life, and retiring the only store breaks every authorization server, issuer, verifier and DID still pointing at its keys.

Read the configured resources
3

Confirm what can actually sign

GET /api/kms/v1/providers200 OK

The runtime list is the authoritative answer. ownership and sharedFromPlatform separate the tenant's own store from one the platform shares with it, and isDefault marks the provider used when a request omits providerId.

Sharing and enabling are two deliberate halves. The platform attaches selected tenants to a shareable resource, and the tenant then enables it, so a shared store never appears as a surprise default in someone's tenant. Share only stores designed for multi-tenant isolation, because sharing expands the failure domain along with the convenience.

Confirm what can actually sign

Generating keys, importing them and binding them to DIDs continues in Keys and DID. Cloud key stores and external key registration are in Azure KMS and external keys.

What a healthy deployment looks like​

The platform's own secret storage is environment or an operated Vault. It publishes one or more offerings with a real isolation mode, and tenant policy allows exactly the provider types you are prepared to support. Each tenant has one secret assignment, usually set during onboarding, and at least one KMS provider, often the product-managed software default. Keys and DIDs exist on that provider, email accounts and connectors hold secret ids rather than plaintext, and protocol instances name a provider id and key alias for signing.

When something fails, the surface it fails on usually names the product to check.

SymptomLook atNot at
SMTP test send fails authenticationThe email account's host and sender, then the secret handle behind its passwordKMS providers
A JWT or credential signature failsKMS provider status, the key alias, the default providerSecret offerings
Secrets fail to loadSecret management health, the tenant assignment, ETag conflictsBranding
A tenant cannot migrate to an offeringTenant policy, whether the offering is enabled, isolation, an open migrationLicense modules
KMS providers empty after onboardingThe tenant's provisioning capability flags, then Add KMSMigration history

Order of work​

On the platform, confirm secret storage first, then create and test shared provider definitions and publish them as offerings with the isolation mode you intend. Set tenant policy before tenants start adopting anything, since it is what refuses the combinations you do not want. Prepare shareable KMS resources if the product offers platform key stores.

Per tenant, confirm the secret assignment before configuring anything that consumes secrets, because an email account configured against a missing assignment fails at send rather than at save. Make sure a KMS provider exists and set the default if there is more than one, then create keys and DIDs and point the authorization server, issuer, verifier and status lists at the right provider id and aliases.

When moving backends, publish or enable the destination first, run preflight, start the migration and watch it through cutover. Then exercise real consumers, a test email and an actual signature, before letting retention expire.

Next​

Keys and DID for key and identifier lifecycle, Branding and email for the SMTP configuration that depends on secret handles, and License and capabilities if either product is missing from the rail.

Secrets storage reference, Secrets provider reference, Shared providers, Tenant policy, KMS providers reference, Secret Management API, KMS API