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

Key Management: Keys

Catalog id: resource.kms.keys

Every cryptographic key alias the tenant holds, across every runtime provider. Operators work in aliases; the opaque kid is on the detail page. Private material stays in the KMS and no operation on this screen returns it.

Whether keys already exist depends on how the tenant was provisioned. A tenant created with the keysAndDids capability arrives with aliases for the authorization server, issuer and verifier already in place. Without it the table stays empty until someone generates or imports a key.

Audience: tenant administrator, or a platform operator working in tenant context.

Guide: Keys and DID.

Working with keys​

1

List the tenant's keys

GET /api/kms/v1/keys200 OK

Resources > Key Management > Keys shows alias, key type and signature algorithm, with search, Import and Generate key on the toolbar. The captured tenant holds the three keys onboarding creates: oauth2-as-signing, issuer-signing and oid4vp-verifier-signing.

This route is tenant-wide and each entry names its own providerId. Add ?providerId= to restrict it to one provider, which is worth doing when the same alias exists on more than one.

List the tenant's keys
2

Generate a key

POST /api/kms/v1/keys201 Created

The dialog asks for the provider that will hold the key, the alias you will use in protocol configuration and DID binding, and the algorithm, offered from what that provider reports as supported rather than from a fixed list.

The response carries the public JWK. Private material stays in the provider, and the key it created is usable the moment the call returns.

Generate a key
3

Import key material

POST /api/kms/v1/keys/import201 Created
This example was not captured from a live run. It shows the expected shape of the call. Values are illustrative and may not match the current release.

Import is for material created outside the product. The dialog takes a JWK with kty set and an optional alias; over REST the provider and alias travel on keyInfo alongside the key.

Import puts the product in custody of whatever you send, which is the opposite of registration below. Use it only when the private key is genuinely meant to move.

Import key material
4

Read one key

GET /api/kms/v1/keys/customer-tenant-signing-key200 OK

Lookup takes an alias or a kid in the path, with providerId as an optional query parameter to disambiguate. The detail screen has an Info tab with alias, key type, signature algorithm and a copyable kid, and a JWK tab with the public key when the provider exposes one.

The JWK tab uses an explicit allow-list of public members and can show x5c, x5t and x5t#S256 even where no separately managed certificate resource exists. Those fields are certificate metadata carried on the key; their presence does not mean the provider manages certificates. When no public material is available the tab is empty rather than partially filled.

Read one key

Full schema: KMS API.

Registering a key that lives elsewhere​

Registration records a tenant reference to a key that already exists in an authorized provider. It creates nothing, imports nothing, exports nothing and deletes nothing. The request carries only the provider id, the provider-native alias, and optionally the provider's canonical kid, which the service uses to check that both identifiers name the same key.

POST /api/kms/v1/keys/register
Content-Type: application/json
{
"providerId": "<authorized-provider-id>",
"alias": "<provider-native-alias>",
"kid": "<provider-canonical-kid>"
}

A successful registration comes back with origin=external and controlMode=externally_managed. Signing runs through the configured provider as usual. Never put a private key, symmetric material, a credential, a provider handle, a locator or a permit into this request.

The console offers Register existing key only where the provider explicitly reports REGISTER_KEY_REFERENCE. Capability data that is missing, malformed or unreported means the action stays unavailable; the console does not infer support from the fact that a provider is AWS or Azure, or from X.509 support, public-key resolution, IMPORT_KEY or key generation. AWS KMS and Azure Key Vault report the operation because their permit-bound inspection can verify an existing alias and kid. Other backends stay unavailable until they report the same operation.

The dialog needs the exact provider-native alias and never asks for a file, JWK, certificate, secret or credential. After registering, the console reloads the provider-scoped key list before showing the returned origin and control mode.

Registering a reference to a provider-native key

Registering public certificate material​

The certificate route accepts public verification material only, and which source you use follows from what the provider can do.

AWS KMS is not an X.509 certificate store, so link a stored public chain to the registered key:

{
"providerId": "<authorized-aws-provider-id>",
"alias": "<certificate-alias>",
"kind": "key_certificate_chain",
"source": "stored_public_material",
"linkedKeyAlias": "<key-alias>",
"linkedKeyKid": "<provider-canonical-kid>",
"certificateChain": [
"<base64-der-leaf>",
"<base64-der-intermediate>",
"<base64-der-root>"
]
}

Encode each certificate as standard Base64 of its DER bytes, ordered leaf to root. PEM text, concatenated unframed DER and private material are all rejected.

Azure Key Vault holds certificate objects, so a key whose certificate was created alongside it in Key Vault can use the provider-native route instead. The provider has to expose a certificate reference read, reported as GET_CERTIFICATE. The product reads the leaf through the provider on every request; it does not follow AIA URLs and does not export a secret or PFX to reconstruct a chain:

{
"providerId": "<authorized-azure-provider-id>",
"alias": "<leaf-alias>",
"providerCertificateId": "<provider-certificate-id-or-version>",
"kind": "trusted_certificate",
"source": "provider_native"
}

Do not send certificateChain with a provider-native reference. A later read delegates to Azure and returns the provider-backed certificate.

The same source works with "kind": "key_certificate_chain" when the key needs a full chain, for example an mdoc DSC whose x5chain has to carry the IACA above it. Azure serves only the leaf, so EDK completes the chain from the trusted certificates registered for the tenant. Register the issuing CA as a trusted_certificate first; without it the chain read fails rather than returning the leaf on its own.

Which route to pick comes down to where the certificate was issued. A certificate Key Vault created for the key belongs on the provider-native route, where Azure stays the source of the leaf and a substitution is caught on read. A certificate an external CA issued for a key that happens to live in Azure belongs on the stored public material route above, which is the same shape AWS KMS keys use.

Either route treats renewal as a re-registration. The registered fingerprint is what a read is checked against, so a renewed certificate has to be registered before it will be served.

The key's own Certificates tab lists whatever chains certify it, with the source and lifecycle mode of each, and is where a chain is attached or a CSR generated.

Certificates tab of a key, listing the chain that certifies it

On public JWK projections, x5c entries are padded standard Base64 DER certificates, and x5t and x5t#S256 are unpadded Base64url thumbprints over the DER. x5u is excluded because it is a remote locator. DID verification methods use the DID method's own id rather than the provider kid.

Deleting a reference​

For an EXTERNALLY_MANAGED resource, delete removes the EDK reference and leaves the provider's key or certificate exactly where it was.

DELETE /api/kms/v1/keys/<alias>?providerId=<provider-id>
DELETE /api/kms/v1/certificates/<certificate-alias>?providerId=<provider-id>
DELETE /api/kms/v1/certificate-chains/<chain-alias>?providerId=<provider-id>

Use /certificates/{alias} for a registered trusted leaf and /certificate-chains/{alias} for a registered key certificate chain. The Delete action appears on the key detail header where the UI permits it, and the server still refuses when the key is assigned or otherwise protected.

The Postman collection carries disabled, template-safe examples for these routes. Replace the provider and certificate placeholders with values for the target tenant before enabling them.

Providers, Certificates, Keys and DID guide, Azure KMS and external keys, KMS API