| --- |
| layout: api |
| page_title: /sys/rekey - HTTP API |
| description: The `/sys/rekey` endpoints are used to rekey the unseal keys for Vault. |
| --- |
| |
| # `/sys/rekey` |
| |
| @include 'alerts/restricted-root.mdx' |
| |
| The `/sys/rekey` endpoints are used to rekey the unseal keys for Vault. |
| |
| On seals that support stored keys (e.g. HSM PKCS11), the recovery key share(s) |
| can be provided to rekey the root key since no unseal keys are available. The |
| secret shares, secret threshold, and stored shares parameters must be set to 1. |
| Upon successful rekey, no split unseal key shares are returned. |
| |
| ## Read rekey progress |
| |
| This endpoint reads the configuration and progress of the current rekey attempt. |
| |
| | Method | Path | |
| | :----- | :---------------- | |
| | `GET` | `/sys/rekey/init` | |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| http://127.0.0.1:8200/v1/sys/rekey/init |
| ``` |
| |
| ### Sample response |
| |
| ```json |
| { |
| "started": true, |
| "nonce": "2dbd10f1-8528-6246-09e7-82b25b8aba63", |
| "t": 3, |
| "n": 5, |
| "progress": 1, |
| "required": 3, |
| "pgp_fingerprints": ["abcd1234"], |
| "backup": true, |
| "verification_required": false |
| } |
| ``` |
| |
| If a rekey is started, then `n` is the new shares to generate and `t` is the |
| threshold required for the new shares. `progress` is how many unseal keys have |
| been provided for this rekey, where `required` must be reached to complete. The |
| `nonce` for the current rekey operation is also displayed. If PGP keys are being |
| used to encrypt the final shares, the key fingerprints and whether the final |
| keys will be backed up to physical storage will also be displayed. |
| `verification_required` indicates whether verification was enabled for this |
| operation. |
| |
| ## Start rekey |
| |
| This endpoint initializes a new rekey attempt. Only a single rekey attempt can |
| take place at a time, and changing the parameters of a rekey requires canceling |
| and starting a new rekey, which will also provide a new nonce. |
| |
| | Method | Path | |
| | :----- | :---------------- | |
| | `POST` | `/sys/rekey/init` | |
| |
| ### Parameters |
| |
| - `secret_shares` `(int: <required>)` – Specifies the number of shares to split |
| the root key into. |
| |
| - `secret_threshold` `(int: <required>)` – Specifies the number of shares |
| required to reconstruct the root key. This must be less than or equal to |
| `secret_shares`. |
| |
| - `pgp_keys` `(array<string>: nil)` – Specifies an array of PGP public keys used |
| to encrypt the output unseal keys. Ordering is preserved. The keys must be |
| base64-encoded from their original binary representation. The size of this |
| array must be the same as `secret_shares`. |
| |
| - `backup` `(bool: false)` – Specifies if using PGP-encrypted keys, whether |
| Vault should also store a plaintext backup of the PGP-encrypted keys at |
| `core/unseal-keys-backup` in the physical storage backend. These can then |
| be retrieved and removed via the `sys/rekey/backup` endpoint. |
| |
| - `require_verification` `(bool: false)` – This turns on verification |
| functionality. When verification is turned on, after successful authorization |
| with the current unseal keys, the new unseal keys are returned but the master |
| key is not actually rotated. The new keys must be provided to authorize the |
| actual rotation of the root key. This ensures that the new keys have been |
| successfully saved and protects against a risk of the keys being lost after |
| rotation but before they can be persisted. This can be used with or without |
| `pgp_keys`, and when used with it, it allows ensuring that the returned keys |
| can be successfully decrypted before committing to the new shares, which the |
| backup functionality does not provide. |
| |
| ### Sample payload |
| |
| ```json |
| { |
| "secret_shares": 10, |
| "secret_threshold": 5 |
| } |
| ``` |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| --request POST \ |
| --data @payload.json \ |
| http://127.0.0.1:8200/v1/sys/rekey/init |
| ``` |
| |
| ## Cancel rekey |
| |
| This endpoint cancels any in-progress rekey. This clears the rekey settings as |
| well as any progress made. This must be called to change the parameters of the |
| rekey. Note: verification is still a part of a rekey. If rekeying is canceled |
| during the verification flow, the current unseal keys remain valid. |
| |
| | Method | Path | |
| | :------- | :---------------- | |
| | `DELETE` | `/sys/rekey/init` | |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| --request DELETE \ |
| http://127.0.0.1:8200/v1/sys/rekey/init |
| ``` |
| |
| ## Read backup key |
| |
| This endpoint returns the backup copy of PGP-encrypted unseal keys. The returned |
| value is the nonce of the rekey operation and a map of PGP key fingerprint to |
| hex-encoded PGP-encrypted key. |
| |
| | Method | Path | |
| | :----- | :------------------ | |
| | `GET` | `/sys/rekey/backup` | |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| http://127.0.0.1:8200/v1/sys/rekey/backup |
| ``` |
| |
| ### Sample response |
| |
| ```json |
| { |
| "nonce": "2dbd10f1-8528-6246-09e7-82b25b8aba63", |
| "keys": { |
| "abcd1234": "..." |
| } |
| } |
| ``` |
| |
| ## Delete backup key |
| |
| This endpoint deletes the backup copy of PGP-encrypted unseal keys. |
| |
| | Method | Path | |
| | :------- | :------------------ | |
| | `DELETE` | `/sys/rekey/backup` | |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| --request DELETE \ |
| http://127.0.0.1:8200/v1/sys/rekey/backup |
| ``` |
| |
| ## Submit key |
| |
| This endpoint is used to enter a single root key share to progress the rekey |
| of the Vault. If the threshold number of root key shares is reached, Vault |
| will complete the rekey. Otherwise, this API must be called multiple times until |
| that threshold is met. The rekey nonce operation must be provided with each |
| call. |
| |
| When the operation is complete, this will return a response like the example |
| below; otherwise the response will be the same as the `GET` method against |
| `sys/rekey/init`, providing status on the operation itself. |
| |
| If verification was requested, successfully completing this flow will |
| immediately put the operation into a verification state, and provide the nonce |
| for the verification operation. |
| |
| | Method | Path | |
| | :----- | :------------------ | |
| | `POST` | `/sys/rekey/update` | |
| |
| ### Parameters |
| |
| - `key` `(string: <required>)` – Specifies a single master share key. |
| |
| - `nonce` `(string: <required>)` – Specifies the nonce of the rekey operation. |
| |
| ### Sample payload |
| |
| ```json |
| { |
| "key": "AB32...", |
| "nonce": "abcd1234..." |
| } |
| ``` |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| --request POST \ |
| --data @payload.json \ |
| http://127.0.0.1:8200/v1/sys/rekey/update |
| ``` |
| |
| ### Sample response |
| |
| ```json |
| { |
| "complete": true, |
| "keys": ["one", "two", "three"], |
| "nonce": "2dbd10f1-8528-6246-09e7-82b25b8aba63", |
| "pgp_fingerprints": ["abcd1234"], |
| "keys_base64": ["base64keyvalue"], |
| "backup": true, |
| "verification_required": true, |
| "verification_nonce": "8b112c9e-2738-929d-bcc2-19aff249ff10" |
| } |
| ``` |
| |
| If the keys are PGP-encrypted, an array of key fingerprints will also be |
| provided (with the order in which the keys were used for encryption) along with |
| whether or not the keys were backed up to physical storage. |
| |
| ## Read rekey verification progress |
| |
| This endpoint reads the configuration and progress of the current rekey |
| verification attempt. |
| |
| | Method | Path | |
| | :----- | :------------------ | |
| | `GET` | `/sys/rekey/verify` | |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| http://127.0.0.1:8200/v1/sys/rekey/verify |
| ``` |
| |
| ### Sample response |
| |
| ```json |
| { |
| "nonce": "8b112c9e-2738-929d-bcc2-19aff249ff10", |
| "t": 3, |
| "n": 5, |
| "progress": 1 |
| } |
| ``` |
| |
| `n` is the total number of new shares that were generated and `t` is the |
| threshold required for the new shares to pass verification. `progress` is how |
| many of the new unseal keys have been provided for this verification operation. |
| The `nonce` for the current rekey operation is also displayed. |
| |
| ## Cancel rekey verification |
| |
| This endpoint cancels any in-progress rekey verification operation. This clears |
| any progress made and resets the nonce. Unlike a `DELETE` against |
| `sys/rekey/init`, this only resets the current verification operation, not the |
| entire rekey attempt. The return value is the same as `GET` along with the new |
| nonce. |
| |
| | Method | Path | |
| | :------- | :------------------ | |
| | `DELETE` | `/sys/rekey/verify` | |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| --request DELETE \ |
| http://127.0.0.1:8200/v1/sys/rekey/verify |
| ``` |
| |
| ### Sample response |
| |
| ```json |
| { |
| "nonce": "5827bbc1-0110-5725-cc21-beddc129d942", |
| "t": 3, |
| "n": 5, |
| "progress": 0 |
| } |
| ``` |
| |
| ## Submit verification key |
| |
| This endpoint is used to enter a single new key share to progress the rekey |
| verification operation. If the threshold number of new key shares is reached, |
| Vault will complete the rekey by performing the actual rotation of the master |
| key. Otherwise, this API must be called multiple times until that threshold is |
| met. The nonce must be provided with each call. |
| |
| When the operation is complete, this will return a response like the example |
| below; otherwise the response will be the same as the `GET` method against |
| `sys/rekey/verify`, providing status on the operation itself. |
| |
| | Method | Path | |
| | :----- | :------------------ | |
| | `POST` | `/sys/rekey/verify` | |
| |
| ### Parameters |
| |
| - `key` `(string: <required>)` – Specifies a single master share key from the |
| new set of shares. |
| |
| - `nonce` `(string: <required>)` – Specifies the nonce of the rekey |
| verification operation. |
| |
| ### Sample payload |
| |
| ```json |
| { |
| "key": "A58d...", |
| "nonce": "5a27bbc1..." |
| } |
| ``` |
| |
| ### Sample request |
| |
| ```shell-session |
| $ curl \ |
| --header "X-Vault-Token: ..." \ |
| --request POST \ |
| --data @payload.json \ |
| http://127.0.0.1:8200/v1/sys/rekey/verify |
| ``` |
| |
| ### Sample response |
| |
| ```json |
| { |
| "nonce": "5827bbc1-0110-5725-cc21-beddc129d942", |
| "complete": true |
| } |
| ``` |