Create key store
POST/v2/config/digital-wallet/openid/key-management/key-stores
Adds a key store of a provider to the organisation: an external OpenBao or HashiCorp Vault (vault), a key ring in Google Cloud KMS (gcp-kms), one region of AWS KMS (aws-kms), an Azure key vault or managed HSM (azure-key-vault), a Thales Luna Cloud HSM partition (dpod), or a remote signing service with the Cloud Signature Consortium (CSC) API (csc), for example a qualified trust service provider. Give the provider in provider: an id of the providers of the list key store types operation, of the same type. The type local cannot be added: each organisation can already use the key store of the installation.
The wallet checks the format of the settings and of the credentials, then does a connection test. It saves the key store only when the test passes.
| Type | Connection test |
|---|---|
vault | Log in with the authentication method, read the health of the vault and list the keys of the Transit mount. |
gcp-kms | List the keys of the key ring. |
aws-kms | List the keys of the region. |
azure-key-vault | Get a token of the application from Microsoft Entra ID and list the keys of the vault. |
dpod | Put the key store on a signer shard, give the partition to the HSM signer of the platform, wait (at most 90 seconds) until the partition is active, then sign and verify with a session key that does not stay in the partition. When the test fails, the wallet deletes the key store again. |
csc | Get an OAuth 2.0 token and list the credentials. |
A right that the key store does not give to the wallet gives The connection test failed: Key management service refused the request. The wallet refuses an address in a private network, unless the installation allows private addresses. The cloud KMS types use only the official endpoints of the provider.
The credentials are write-only. No answer returns them. An organisation can have at most one key store of each provider. A sandbox organisation cannot add a key store.
Request
- application/json
Body
required
The type, the name, the settings and the credentials of the key store.
- vault
- gcp-kms
- aws-kms
- azure-key-vault
- dpod
- csc
- vault
- gcp-kms
- aws-kms
- azure-key-vault
- dpod
- csc
Possible values: [vault, gcp-kms, aws-kms, azure-key-vault, dpod, csc]
Type of the key store.
Possible values: <= 64 characters
The provider of the key store, an id of the providers of the list key store types operation. Required. The provider must not be hidden by the installation, and its type must be type.
Possible values: <= 100 characters
Name of the key store, at most 100 characters. It must be unique in the organisation.
settings object required
Settings of the type. The wallet refuses an unknown member and checks the format of each value (for example the AWS region, the Azure tenant ID and vault URL, the Google Cloud project ID). An invalid value gives 400 with <field>: <problem>.
Base address of the vault, with https://. The wallet refuses http:// and private network addresses, unless the installation allows private addresses (for example on premises).
Namespace in the vault. Leave it out or send null when the vault has no namespaces.
Mount path of the Transit secrets engine. The default is transit.
PEM bundle of the certificate authorities that the wallet trusts for the TLS certificate of the vault. Without it, the wallet uses the system certificate authorities.
PEM client certificate for mutual TLS. Required for the authentication method cert. With another method, send it when the listener of the vault requires mutual TLS. The private key of the certificate goes in the credential clientPrivateKey.
authentication objectrequired
How the wallet logs in to the vault.
Possible values: [userpass, approle, cert, token]
Authentication method. userpass needs username and the credential password. approle needs roleId and the credential secretId. cert needs clientCertificate and the credential clientPrivateKey, and can have role. token needs the credential token.
Mount path of the authentication method. The default is the name of the method (userpass, approle or cert).
User name, for the method userpass.
Role ID, for the method approle.
Name of the certificate role, for the method cert. Optional.
The Google Cloud project ID of the key ring. A domain-scoped project ID (example.com:my-project) is also accepted.
The Cloud KMS location of the key ring, for example europe-west1.
Possible values: <= 63 characters
The name of the key ring. Letters, digits, _ and -, at most 63 characters.
Possible values: [HSM, SOFTWARE]
The protection level of the keys that the wallet creates. HSM (default) keeps the keys in hardware security modules of Google Cloud (the key store protection is hsm-backed). SOFTWARE keeps them in software (the key store protection is software).
The AWS region of the keys, for example eu-central-1. Free text with a format check, not a fixed list.
authentication object
How the wallet logs in to AWS KMS.
Possible values: [accessKey]
Authentication method. accessKey (the only method) needs the credentials accessKeyId and secretAccessKey.
The URL of the key vault (https://<name>.vault.azure.net) or of the managed HSM (https://<name>.managedhsm.azure.net), without a path and without a trailing /.
The Microsoft Entra tenant ID, a GUID or a domain name (for example contoso.onmicrosoft.com).
The application (client) ID of the app registration, a GUID.
Possible values: [EC-HSM, EC]
The key type of the keys that the wallet creates. EC-HSM (default) keeps the keys in hardware security modules (the key store protection is hsm-backed). EC keeps them in software (the key store protection is software). A managed HSM has EC-HSM keys only.
authentication objectrequired
How the application logs in to Microsoft Entra ID.
Possible values: [clientSecret, clientCertificate]
Authentication method. clientSecret needs the credential clientSecret. clientCertificate needs the credentials clientCertificate and clientPrivateKey.
Possible values: <= 32 characters
The label of the partition, at most 32 bytes in UTF-8, without a control character, ;, { or }. The wallet removes the spaces around it.
Possible values: Value must match regular expression ^[0-9]{1,16}$
The serial number of the partition, a string of 1 to 16 digits. Optional; an empty string is the same as null, and a number is refused. When given, the HSM signer checks that the partition has this serial number.
Base URL of the CSC API of the QTSP, with https://.
Possible values: [v1, v2]
Version of the CSC API. The default is v1.
OAuth 2.0 client ID that the QTSP gave the organisation.
User ID that the QTSP registered for the organisation.
credentials object
Write-only credentials of the type. Give the credentials that the settings use (for vault and azure-key-vault, the credentials of the authentication method).
Password, for the method userpass.
Secret ID, for the method approle.
Vault token, for the method token.
PEM private key of clientCertificate, without a password. Required for the method cert, and when you give clientCertificate with another method.
The JSON key file of a Google Cloud service account, as one string (the text of the file, not an object). Required. The wallet checks that the text is JSON, that type is service_account, that it has client_email and a PEM private_key, and that the service account is of googleapis.com. The wallet never sends a request to an address of the key file.
The access key ID. Required.
The secret access key. Required.
The client secret of the application, for the method clientSecret.
The PEM certificate of the application, for the method clientCertificate.
The PEM private key of clientCertificate, without a password, for the method clientCertificate. It must be the private key of the certificate.
Possible values: <= 2048 characters
The value AuthTokenConfigURI of Chrystoki.conf, an https URL.
Possible values: <= 512 characters
The value AuthTokenClientId of Chrystoki.conf.
Possible values: <= 2048 characters
The value AuthTokenClientSecret of Chrystoki.conf.
Possible values: <= 256 characters
The PIN of the Crypto Officer of the partition. The HSM signer logs in one time with each new PIN. After a wrong PIN it does not log in again until you give a new PIN, because the partition locks after too many wrong PINs.
OAuth 2.0 client secret that the QTSP gave the organisation. Required.
PIN of the user at the QTSP. Optional. The wallet uses it for a referenced key that has no PIN of its own (providerSecret), and for document signing.
Responses
- 201
- 400
- 401
- 403
- 409
- 500
- 503
The service tested and saved the key store, and returned it.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
- local
- vault
- gcp-kms
- aws-kms
- azure-key-vault
- dpod
- csc
Unique identifier of the key store. local-openbao, local-database or local-hsm for a key store of the installation, else a UUID.
Possible values: [local, vault, gcp-kms, aws-kms, azure-key-vault, dpod, csc]
Type of the key store. local is a key store of the installation (OpenBao Transit, the wallet database, or the hardware security module of the installation). Each organisation can use it, and the API cannot add, change or delete it. vault is an external OpenBao or HashiCorp Vault of the organisation. gcp-kms is a key ring in Google Cloud KMS. aws-kms is one region of an AWS account (AWS KMS). azure-key-vault is an Azure key vault or managed HSM. dpod is a partition of a Thales Luna Cloud HSM service (DPoD). csc is a remote signing service with the Cloud Signature Consortium (CSC) API, for example a qualified trust service provider (QTSP).
The provider of the key store, an id of the providers of the list key store types operation (for example openbao, hashicorp-vault, google-cloud-kms or intesi). null for a local key store. It cannot change. An organisation has at most one key store of each provider.
Possible values: <= 100 characters
Name of the key store. It is unique in the organisation.
Shows true for a key store of the installation (type local).
Possible values: [active, disabled, error]
Status of the key store. active when the key store works. error after a connection test that failed. disabled is reserved.
Possible values: [software, hsm, hsm-backed, dedicated-hsm, provider]
Where the private keys of this key store are. software: in the software of a key management service (local with the backend openbao or database, vault, gcp-kms with the protection level SOFTWARE, azure-key-vault with the key type EC). hsm: in the hardware security module of the installation (local with the backend hsm). hsm-backed: in a cloud KMS that keeps the keys in hardware security modules of the cloud provider (gcp-kms with HSM, aws-kms, azure-key-vault with EC-HSM). dedicated-hsm: in a hardware security module partition of the organisation (dpod). provider: at the provider, which decides how it protects the keys (csc). An organisation key store has the protection of its provider, unless its settings decide.
settings object required
Settings of the key store type. Never a secret.
Possible values: [openbao, database, hsm]
Where the installation keeps the keys. openbao for OpenBao Transit (local-openbao), database for the wallet database (local-database, legacy, no new keys), hsm for the hardware security module of the installation (local-hsm). With hsm, the new local keys of the organisations go to the HSM; the keys in local-openbao stay there and keep working.
Possible values: [software, hsm]
How the key store protects the keys. software for the backends openbao and database, hsm for the backend hsm.
Base address of the vault, with https://. The wallet refuses http:// and private network addresses, unless the installation allows private addresses (for example on premises).
Namespace in the vault. Leave it out or send null when the vault has no namespaces.
Mount path of the Transit secrets engine. The default is transit.
PEM bundle of the certificate authorities that the wallet trusts for the TLS certificate of the vault. Without it, the wallet uses the system certificate authorities.
PEM client certificate for mutual TLS. Required for the authentication method cert. With another method, send it when the listener of the vault requires mutual TLS. The private key of the certificate goes in the credential clientPrivateKey.
authentication objectrequired
How the wallet logs in to the vault.
Possible values: [userpass, approle, cert, token]
Authentication method. userpass needs username and the credential password. approle needs roleId and the credential secretId. cert needs clientCertificate and the credential clientPrivateKey, and can have role. token needs the credential token.
Mount path of the authentication method. The default is the name of the method (userpass, approle or cert).
User name, for the method userpass.
Role ID, for the method approle.
Name of the certificate role, for the method cert. Optional.
The Google Cloud project ID of the key ring. A domain-scoped project ID (example.com:my-project) is also accepted.
The Cloud KMS location of the key ring, for example europe-west1.
Possible values: <= 63 characters
The name of the key ring. Letters, digits, _ and -, at most 63 characters.
Possible values: [HSM, SOFTWARE]
The protection level of the keys that the wallet creates. HSM (default) keeps the keys in hardware security modules of Google Cloud (the key store protection is hsm-backed). SOFTWARE keeps them in software (the key store protection is software).
The AWS region of the keys, for example eu-central-1. Free text with a format check, not a fixed list.
authentication object
How the wallet logs in to AWS KMS.
Possible values: [accessKey]
Authentication method. accessKey (the only method) needs the credentials accessKeyId and secretAccessKey.
The URL of the key vault (https://<name>.vault.azure.net) or of the managed HSM (https://<name>.managedhsm.azure.net), without a path and without a trailing /.
The Microsoft Entra tenant ID, a GUID or a domain name (for example contoso.onmicrosoft.com).
The application (client) ID of the app registration, a GUID.
Possible values: [EC-HSM, EC]
The key type of the keys that the wallet creates. EC-HSM (default) keeps the keys in hardware security modules (the key store protection is hsm-backed). EC keeps them in software (the key store protection is software). A managed HSM has EC-HSM keys only.
authentication objectrequired
How the application logs in to Microsoft Entra ID.
Possible values: [clientSecret, clientCertificate]
Authentication method. clientSecret needs the credential clientSecret. clientCertificate needs the credentials clientCertificate and clientPrivateKey.
Possible values: <= 32 characters
The label of the partition, at most 32 bytes in UTF-8, without a control character, ;, { or }. The wallet removes the spaces around it.
Possible values: Value must match regular expression ^[0-9]{1,16}$
The serial number of the partition, a string of 1 to 16 digits. Optional; an empty string is the same as null, and a number is refused. When given, the HSM signer checks that the partition has this serial number.
Base URL of the CSC API of the QTSP, with https://.
Possible values: [v1, v2]
Version of the CSC API. The default is v1.
OAuth 2.0 client ID that the QTSP gave the organisation.
User ID that the QTSP registered for the organisation.
credentialsConfigured objectrequired
For each credential field of the key store type, true when the wallet has a value. The answer never has the value. Empty for the type local. The fields: vault password, secretId, token, clientPrivateKey; gcp-kms serviceAccountKey; aws-kms accessKeyId, secretAccessKey; azure-key-vault clientSecret, clientCertificate, clientPrivateKey; dpod authTokenConfigUri, authTokenClientId, authTokenClientSecret, pin; csc clientSecret, userPin.
Possible values: [create, import, reference, sign, csr, certificateChain, listProviderKeys, test, edit, delete]
What the key store can do. The type sets them. local (the key store that takes new keys): create, import, sign, csr, certificateChain, test (no import with the backend hsm). local (the other key store of the installation): sign, csr, certificateChain, test. vault: create, import, reference, sign, csr, certificateChain, listProviderKeys, test, edit, delete. gcp-kms, aws-kms, azure-key-vault and dpod: create, reference, sign, csr, certificateChain, listProviderKeys, test, edit, delete (no import). csc: reference, sign, listProviderKeys, test, edit, delete.
Shows if the key store keeps the keys in a qualified signature creation device (QSCD). false, or provider for the type csc, where the QTSP decides.
Number of keys of the organisation in the key store.
Possible values: [qualified, not-qualified, unknown]
Only for a key store of a provider with qualified true (category qtsp): qualified when every key of the key store is qualified and there is at least one key, not-qualified when a key is not, else unknown. null for every other key store: no other key store claims a qualified status. See trust of the key.
Time of the last connection test, in UTC. null before the first test.
lastCheckResult objectnullable
Result of a connection test of a key store.
Shows true when the connection test passed.
Why the connection test failed, as a safe text. It never has a secret or the detail of the provider. null when the test passed.
Time of the connection test, in UTC.
Creation time of the key store, in UTC.
Time of the last change of the key store, in UTC.
{
"id": "local-openbao",
"type": "local",
"provider": null,
"name": "Local vault",
"local": true,
"status": "active",
"protection": "software",
"settings": {},
"credentialsConfigured": {},
"capabilities": [
"create",
"import",
"sign",
"csr",
"certificateChain",
"test"
],
"qscd": false,
"keyCount": 3,
"qualifiedStatus": null,
"lastCheckedAt": null,
"lastCheckResult": {
"ok": true,
"message": null,
"checkedAt": "2026-10-20T10:05:00Z"
},
"createdAt": "2026-10-20T10:00:00Z",
"updatedAt": "2026-10-20T10:00:00Z"
}
The body, the settings or the credentials are not valid (<field>: <problem>), a credential that the settings need is missing (credentials.<name>: required), the type is local, the provider is missing, unknown, hidden by the installation or of another type, the organisation is a sandbox organisation, or the connection test failed (The connection test failed: <message>). errorDescription tells why, as a safe text.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
Unauthorized
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
The installation does not let an organisation add a key store of this type (The key store type <type> is not allowed in this installation.), or, for dpod, the installation has no HSM signer (This installation has no HSM signer for DPoD partitions.).
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
The organisation already has a key store with this name, or a key store of this provider (The organisation already has a key store of this provider: <provider name>).
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
Internal server error
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
The provider of the key store is not available, or, for dpod, the HSM signers of the installation have no free capacity for a partition.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}