mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-30 18:17:55 +00:00 
			
		
		
		
	Document CMPv2 (#27915)
* CMPv2 Documentation, and restructuring of Issuance Protocols into its own section for PKI. * title * CMPv2 API * Add default path policy * Update website/content/docs/secrets/pki/cmpv2.mdx Co-authored-by: Sarah Chavis <62406755+schavis@users.noreply.github.com> * Update website/content/docs/secrets/pki/cmpv2.mdx Co-authored-by: Sarah Chavis <62406755+schavis@users.noreply.github.com> * Update website/content/docs/secrets/pki/cmpv2.mdx Co-authored-by: Sarah Chavis <62406755+schavis@users.noreply.github.com> * Update website/content/docs/secrets/pki/cmpv2.mdx Co-authored-by: Sarah Chavis <62406755+schavis@users.noreply.github.com> * respond to some PR feedback * pr feedback * Fix nav and add key_usage * Update website/content/docs/secrets/pki/cmpv2.mdx Co-authored-by: Steven Clark <steven.clark@hashicorp.com> * Update website/content/docs/secrets/pki/cmpv2.mdx Co-authored-by: Steven Clark <steven.clark@hashicorp.com> * Update website/content/api-docs/secret/pki/issuance.mdx Co-authored-by: Steven Clark <steven.clark@hashicorp.com> * Docs fixes --------- Co-authored-by: Sarah Chavis <62406755+schavis@users.noreply.github.com> Co-authored-by: Steven Clark <steven.clark@hashicorp.com>
This commit is contained in:
		| @@ -19,13 +19,6 @@ update your API calls accordingly. | |||||||
| ## Table of contents | ## Table of contents | ||||||
| 
 | 
 | ||||||
| - [Notice About New Multi-Issuer Functionality](#notice-about-new-multi-issuer-functionality) | - [Notice About New Multi-Issuer Functionality](#notice-about-new-multi-issuer-functionality) | ||||||
| - [ACME Certificate Issuance](#acme-certificate-issuance) |  | ||||||
|   - [ACME Directories](#acme-directories) |  | ||||||
|   - [Get ACME EAB Binding Token](#get-acme-eab-binding-token) |  | ||||||
|   - [List Unused ACME EAB Binding Tokens](#list-unused-acme-eab-binding-tokens) |  | ||||||
|   - [Delete Unused ACME EAB Binding Tokens](#delete-unused-acme-eab-binding-tokens) |  | ||||||
|   - [Get ACME Configuration](#get-acme-configuration) |  | ||||||
|   - [Set ACME Configuration](#set-acme-configuration) |  | ||||||
| - [Issuing Certificates](#issuing-certificates) | - [Issuing Certificates](#issuing-certificates) | ||||||
|   - [List Roles](#list-roles) |   - [List Roles](#list-roles) | ||||||
|   - [Read Role](#read-role) |   - [Read Role](#read-role) | ||||||
| @@ -93,10 +86,7 @@ update your API calls accordingly. | |||||||
|   - [Set Automatic Tidy Configuration](#set-automatic-tidy-configuration) |   - [Set Automatic Tidy Configuration](#set-automatic-tidy-configuration) | ||||||
|   - [Tidy Status](#tidy-status) |   - [Tidy Status](#tidy-status) | ||||||
|   - [Cancel Tidy](#cancel-tidy) |   - [Cancel Tidy](#cancel-tidy) | ||||||
| - [EST - Certificate Issuance <EnterpriseAlert inline="true" />](#est-certificate-issuance) | - [Certificate Issuance Protocols](/vault/api-docs/secret/pki/issuance) | ||||||
|   - [EST Protocol Paths <EnterpriseAlert inline="true" />](#est-protocol-paths) |  | ||||||
|   - [Read EST Configuration <EnterpriseAlert inline="true" />](#read-est-configuration) |  | ||||||
|   - [Set EST Configuration <EnterpriseAlert inline="true" />](#set-est-configuration) |  | ||||||
| - [Cluster Scalability](#cluster-scalability) | - [Cluster Scalability](#cluster-scalability) | ||||||
| - [Managed Key](#managed-keys) (Enterprise Only) | - [Managed Key](#managed-keys) (Enterprise Only) | ||||||
| - [Vault CLI with DER/PEM responses](#vault-cli-with-der-pem-responses) | - [Vault CLI with DER/PEM responses](#vault-cli-with-der-pem-responses) | ||||||
| @@ -123,351 +113,6 @@ to mix different types of CAs (roots and intermediates). | |||||||
|    current issuing certificate on migration from an older Vault version |    current issuing certificate on migration from an older Vault version | ||||||
|    (Vault < 1.11.0). |    (Vault < 1.11.0). | ||||||
| 
 | 
 | ||||||
| ## ACME certificate issuance |  | ||||||
| 
 |  | ||||||
| Starting with Vault 1.14, Vault supports the [ACME certificate lifecycle |  | ||||||
| management protocol](https://datatracker.ietf.org/doc/html/rfc8555) for issuing |  | ||||||
| and renewing leaf server certificates. |  | ||||||
| 
 |  | ||||||
| In order to use ACME, a [cluster path](#set-cluster-configuration) must be |  | ||||||
| set and ACME must be [enabled in its configuration](#set-acme-configuration) |  | ||||||
| with the [required headers](#acme-required-headers) enabled on the mount |  | ||||||
| tuning. |  | ||||||
| 
 |  | ||||||
| Using ACME with a role requires `no_store=false` to be set on the role; this |  | ||||||
| allows the certificate to be stored and later fetched through the ACME |  | ||||||
| protocol. |  | ||||||
| 
 |  | ||||||
| ### ACME directories |  | ||||||
| 
 |  | ||||||
| Vault PKI supports the following ACME directories, providing different |  | ||||||
| restrictions around usage (defaults, a specific issuer and/or a specific |  | ||||||
| role). To interact with these directories, specify the directory URL in |  | ||||||
| an ACME client. For example, with the EFF's [CertBot](https://certbot.eff.org/): |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ certbot certonly --server https://localhost:8200/v1/pki/acme/directory ... |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| These endpoints are unauthenticated from a Vault authentication model, but |  | ||||||
| internally authenticated via the ACME protocol. |  | ||||||
| 
 |  | ||||||
| | Method | Path                                                               | Default Directory Policy   | Issuer                | Role          | |  | ||||||
| |:-------|:-------------------------------------------------------------------|:---------------------------|:----------------------|:--------------| |  | ||||||
| | `ACME` | `/pki/acme/directory`                                              | `sign-verbatim`            | `default`             | Sign-Verbatim | |  | ||||||
| | `ACME` | `/pki/acme/directory`                                              | `role:role_ref`            | Specified by the role | `:role_ref`   | |  | ||||||
| | `ACME` | `/pki/acme/directory`                                              | `external-policy(:policy)` | Specified by CIEPS    | CIEPS         | |  | ||||||
| | `ACME` | `/pki/issuer/:issuer_ref/acme/directory`                           | `sign-verbatim`            | `:issuer_ref`         | Sign-Verbatim | |  | ||||||
| | `ACME` | `/pki/issuer/:issuer_ref/acme/directory`                           | `role:role_ref`            | `:issuer_ref`         | `:role_ref`   | |  | ||||||
| | `ACME` | `/pki/roles/:role/acme/directory`                                  | (any)                      | Specified by the role | `:role`       | |  | ||||||
| | `ACME` | `/pki/issuer/:issuer_ref/roles/:role/acme/directory`               | (any)                      | `:issuer_ref`         | `:role`       | |  | ||||||
| | `ACME` | `/pki/external-policy(/:policy)/acme/directory`                    | (any)                      | Specified by CIEPS    | CIEPS         | |  | ||||||
| | `ACME` | `/pki/issuer/:issuer_ref/external-policy(/:policy)/acme/directory` | (any)                      | Specified by CIEPS    | CIEPS         | |  | ||||||
| 
 |  | ||||||
| When a role is not explicitly specified, behavior is specified by the |  | ||||||
| `default_directory_policy` in the [ACME configuration](#set-acme-configuration). |  | ||||||
| These directories can also be forbidden by setting that policy as `forbid`.  If |  | ||||||
| the policy is `sign-verbatim` then _any_ identifier for which the client can |  | ||||||
| prove ownership of will be issued for.  This is similar to using the |  | ||||||
| [Sign Verbatim](#sign-verbatim) endpoint, but with additional verification |  | ||||||
| that the client has proven ownership (within the ACME protocol) of the |  | ||||||
| requested certificate identifiers. When `external-policy` is specified as the |  | ||||||
| default value, the Certificate Issuance External |  | ||||||
| Policy Service (CIEPS)<EnterpriseAlert inline="true" /> is used for |  | ||||||
| validating and templating the certificate instead of a role; ACME's challenge |  | ||||||
| validation is still enforced. An optional policy name can be specified by using |  | ||||||
| `external-policy:policy`. Roles are not used when CIEPS is used. |  | ||||||
| 
 |  | ||||||
| #### ACME challenge types |  | ||||||
| 
 |  | ||||||
| Vault supports the following ACME challenge types presently: |  | ||||||
| 
 |  | ||||||
|  - `http-01`, supporting both `dns` and `ip` identifiers. |  | ||||||
|  - `dns-01`, supporting `dns` identifiers including wildcards. |  | ||||||
|  - `tls-alpn-01`, supporting only non-wildcard `dns` identifiers. |  | ||||||
| 
 |  | ||||||
| A custom DNS resolver used by the server for looking up DNS names for use |  | ||||||
| with both mechanisms can be added via the [ACME configuration](#set-acme-configuration). |  | ||||||
| 
 |  | ||||||
| #### ACME external account bindings |  | ||||||
| 
 |  | ||||||
| ACME External Account Binding (EAB) Policy can enforce that clients need to |  | ||||||
| have a valid external account binding to Vault. Before registering a new account, |  | ||||||
| an authenticated Vault client will need to [fetch a new EAB |  | ||||||
| token](#get-acme-eab-binding-token). This returns two values: a key identifier |  | ||||||
| and an HMAC key used by the ACME client to authenticate with EAB. For example: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ vault write -f /pki/acme/new-eab |  | ||||||
| $ certbot certonly --server https://localhost:8200/v1/pki/acme/directory \ |  | ||||||
|                    --eab-kid <id> --eab-hmac-key <hmac-key> |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| With or without EAB, requests from the ACME client are not authenticated using |  | ||||||
| traditional Vault authentication, but are instead authenticated through the |  | ||||||
| ACME protocol. With EAB however, a Vault authenticated client will have to |  | ||||||
| fetch an EAB token and pass it to the ACME client for use on the initial |  | ||||||
| registration: this binds the ACME client's registration to an authenticated |  | ||||||
| Vault endpoint, but not further to the client's entity or other information. |  | ||||||
| 
 |  | ||||||
| ~> Note: Enabling EAB is strongly recommended for public-facing Vault |  | ||||||
|    deployments. Use of the `VAULT_DISABLE_PUBLIC_ACME` environment variable |  | ||||||
|    can be used to enforce all ACME instances have EAB enabled. |  | ||||||
| 
 |  | ||||||
| #### ACME accounts |  | ||||||
| 
 |  | ||||||
| ACME Accounts are created specific to a particular directory and are not |  | ||||||
| portable across Performance Secondary clusters. |  | ||||||
| 
 |  | ||||||
| #### ACME required headers |  | ||||||
| 
 |  | ||||||
| ACME requires the following response headers (`allowed_response_headers`) |  | ||||||
| to be specified by [mount tuning](/vault/api-docs/system/mounts#tune-mount-configuration): |  | ||||||
| 
 |  | ||||||
|  - `Replay-Nonce` |  | ||||||
|  - `Link` |  | ||||||
|  - `Location` |  | ||||||
| 
 |  | ||||||
| On an existing mount, these can be specified by running the following command: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ vault secrets tune -allowed-response-headers=Location -allowed-response-headers=Replay-Nonce \ |  | ||||||
|                      -allowed-response-headers=Link \ |  | ||||||
|                      pki/ |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### Get ACME EAB binding token |  | ||||||
| 
 |  | ||||||
| This endpoint returns a new ACME binding token. The `id` response field can |  | ||||||
| be used as the key identifier and the `key` response field be used as the |  | ||||||
| EAB HMAC key in the ACME Client. |  | ||||||
| 
 |  | ||||||
| Each call to this endpoint will generate and return a new EAB binding token |  | ||||||
| that is linked to the specific ACME directory it resides under. EAB tokens |  | ||||||
| are not usable across different ACME directories. |  | ||||||
| 
 |  | ||||||
| | Method | Path                                               | |  | ||||||
| |:-------|:---------------------------------------------------| |  | ||||||
| | `POST` | `/pki/acme/new-eab`                                | |  | ||||||
| | `POST` | `/pki/issuer/:issuer_ref/acme/new-eab`             | |  | ||||||
| | `POST` | `/pki/roles/:role/acme/new-eab`                    | |  | ||||||
| | `POST` | `/pki/issuer/:issuer_ref/roles/:role/acme/new-eab` | |  | ||||||
| 
 |  | ||||||
| #### Parameters |  | ||||||
| 
 |  | ||||||
| No parameters. |  | ||||||
| 
 |  | ||||||
| #### Sample request |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ curl \ |  | ||||||
|     --header "X-Vault-Token: ..." \ |  | ||||||
|     --request POST \ |  | ||||||
|     http://127.0.0.1:8200/v1/pki/acme/new-eab |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample response |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| { |  | ||||||
|   "data": { |  | ||||||
|     "created_on": "2023-05-24T14:33:00-04:00", |  | ||||||
|     "id": "bc8088d9-3816-5177-ae8e-d8393265f7dd", |  | ||||||
|     "key_type": "hs", |  | ||||||
|     "acme_directory": "acme/directory", |  | ||||||
|     "key": "MHcCAQE... additional data elided ...", |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### List unused ACME EAB binding tokens |  | ||||||
| 
 |  | ||||||
| This endpoint returns a list of all unused ACME binding tokens; once used, |  | ||||||
| they will be removed from this list. |  | ||||||
| 
 |  | ||||||
| | Method | Path       | |  | ||||||
| | :----- | :--------- | |  | ||||||
| | `LIST` | `/pki/eab` | |  | ||||||
| 
 |  | ||||||
| #### Sample request |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ curl \ |  | ||||||
|     --header "X-Vault-Token: ..." \ |  | ||||||
|     --request LIST \ |  | ||||||
|     http://127.0.0.1:8200/v1/pki/eab |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample response |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| { |  | ||||||
|   "data": { |  | ||||||
|     "key_info": { |  | ||||||
|       "bc8088d9-3816-5177-ae8e-d8393265f7dd": { |  | ||||||
|         "created_on": "2023-05-24T14:33:00-04:00", |  | ||||||
|         "key_type": "hs", |  | ||||||
|         "acme_directory": "acme/directory" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     "keys": [ |  | ||||||
|       "bc8088d9-3816-5177-ae8e-d8393265f7dd" |  | ||||||
|     ] |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### Delete unused ACME EAB binding tokens |  | ||||||
| 
 |  | ||||||
| This endpoint allows the deletion of an unused ACME binding token. |  | ||||||
| 
 |  | ||||||
| | Method   | Path               | |  | ||||||
| | :------- | :----------------- | |  | ||||||
| | `DELETE` | `/pki/eab/:key_id` | |  | ||||||
| 
 |  | ||||||
| #### Parameters |  | ||||||
| 
 |  | ||||||
|  - `key_id` `(string: <required>)` - The id of the EAB binding token to |  | ||||||
|    delete. This is part of the request URL. |  | ||||||
| 
 |  | ||||||
| #### Sample request |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ curl \ |  | ||||||
|     --header "X-Vault-Token: ..." \ |  | ||||||
|     --request DELETE \ |  | ||||||
|     http://127.0.0.1:8200/v1/pki/eab/bc8088d9-3816-5177-ae8e-d8393265f7dd |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### Get ACME configuration |  | ||||||
| 
 |  | ||||||
| This endpoint allows reading of the current ACME server configuration used by |  | ||||||
| this mount. |  | ||||||
| 
 |  | ||||||
| | Method | Path               | |  | ||||||
| | :----- | :----------------- | |  | ||||||
| | `GET`  | `/pki/config/acme` | |  | ||||||
| 
 |  | ||||||
| #### Sample request |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ curl \ |  | ||||||
|     --header "X-Vault-Token: ..." \ |  | ||||||
|     http://127.0.0.1:8200/v1/pki/config/acme |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample response |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| { |  | ||||||
|   "data": { |  | ||||||
|     "allowed_issuers": [ |  | ||||||
|       "*" |  | ||||||
|     ], |  | ||||||
|     "allowed_roles": [ |  | ||||||
|       "*" |  | ||||||
|     ], |  | ||||||
|     "default_directory_policy": "sign-verbatim", |  | ||||||
|     "dns_resolver": "", |  | ||||||
|     "eab_policy": "not-required", |  | ||||||
|     "enabled": true, |  | ||||||
|     "max_ttl": 776000 |  | ||||||
|   }, |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### Set ACME configuration |  | ||||||
| 
 |  | ||||||
| This endpoint allows setting the ACME server configuration used by this |  | ||||||
| mount. |  | ||||||
| 
 |  | ||||||
| | Method | Path               | |  | ||||||
| | :----- | :----------------- | |  | ||||||
| | `POST` | `/pki/config/acme` | |  | ||||||
| 
 |  | ||||||
| #### Parameters |  | ||||||
| 
 |  | ||||||
|  - `allowed_issuers` `(list: ["*"])` - Specifies a list issuers allowed to |  | ||||||
|    issue certificates via explicit ACME paths. If an allowed role specifies |  | ||||||
|    an issuer outside this list, it will be allowed. The default value `*` |  | ||||||
|    allows every issuer within the mount. |  | ||||||
| 
 |  | ||||||
|   - `allow_role_ext_key_usage` `(bool: false)` - whether the ExtKeyUsage field |  | ||||||
|    from a role is used, defaults to false meaning that certificate will be |  | ||||||
|    signed with ServerAuth. |  | ||||||
| 
 |  | ||||||
|  - `allowed_roles` `(list: ["*"])` - Specifies a list of roles allowed to |  | ||||||
|    issue certificates via explicit ACME paths.  The default value `*` allows |  | ||||||
|    every role within the mount to be used.  If the `default_directory_policy` |  | ||||||
|    specifies a role, it must be allowed under this configuration. |  | ||||||
| 
 |  | ||||||
|  - `default_directory_policy` `(string: "sign-verbatim")` - Specifies the |  | ||||||
|    behavior of the default ACME directory.  Can be `forbid`, `sign-verbatim` |  | ||||||
|    or a role given by `role:<role_name>`.  If a role is used, it must be |  | ||||||
|    present in `allowed_roles`. |  | ||||||
| 
 |  | ||||||
|  - `dns_resolver` `(string: "")` - An optional overriding DNS resolver to |  | ||||||
|    use for challenge verification lookups. When not specified, the default |  | ||||||
|    system resolver will be used. This allows domains on peered networks with |  | ||||||
|    an accessible DNS resolver to be validated. |  | ||||||
| 
 |  | ||||||
|  - `eab_policy` `(string: "not-required")` - Specified policy to enforce |  | ||||||
|    around [External Account Bindings (EABs)](#acme-external-account-bindings). |  | ||||||
|    The allowed values are: |  | ||||||
| 
 |  | ||||||
|      - `not-required`, where EABs are not enforced but are validated if |  | ||||||
|         specified. |  | ||||||
| 
 |  | ||||||
|      - `new-account-required`, where new accounts are required to have EAB |  | ||||||
|        but existing accounts can still be used. |  | ||||||
| 
 |  | ||||||
|      - `always-required`, where all accounts regardless of age are required |  | ||||||
|        to have EABs set. |  | ||||||
| 
 |  | ||||||
|  - `enabled` `(bool: false)` - Whether ACME is enabled on this mount. When |  | ||||||
|    ACME is disabled, all requests to ACME directory URLs will return 404. |  | ||||||
| 
 |  | ||||||
|  - `max_ttl` `(string: "")` - Specifies the maximum Time To Live provided as a |  | ||||||
|    string duration with time suffix. Hour is the largest suffix. If not set, |  | ||||||
|    defaults to the previous hard-coded behavior of 90 days (2160 hours). |  | ||||||
| 
 |  | ||||||
| #### Sample payload |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| { |  | ||||||
|     "enabled": true |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample request |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ curl \ |  | ||||||
|     --header "X-Vault-Token: ..." \ |  | ||||||
|     --request POST \ |  | ||||||
|     --data @payload.json \ |  | ||||||
|     http://127.0.0.1:8200/v1/pki/config/acme |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample response |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| { |  | ||||||
|   "data": { |  | ||||||
|     "allowed_issuers": [ |  | ||||||
|       "*" |  | ||||||
|     ], |  | ||||||
|     "allowed_roles": [ |  | ||||||
|       "*" |  | ||||||
|     ], |  | ||||||
|     "default_directory_policy": "sign-verbatim", |  | ||||||
|     "dns_resolver": "", |  | ||||||
|     "eab_policy": "not-required", |  | ||||||
|     "enabled": true |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ## Issuing certificates | ## Issuing certificates | ||||||
| 
 | 
 | ||||||
| The following API endpoints allow users or operators to request certificates | The following API endpoints allow users or operators to request certificates | ||||||
| @@ -4999,166 +4644,6 @@ $ curl \ | |||||||
|     "time_finished": null |     "time_finished": null | ||||||
|   }, |   }, | ||||||
| ``` | ``` | ||||||
| 
 |  | ||||||
| ## EST Certificate issuance <EnterpriseAlert inline="true" /> |  | ||||||
| 
 |  | ||||||
| @include 'alerts/beta.mdx' |  | ||||||
| 
 |  | ||||||
| Within Vault Enterprise, support can be enabled for the |  | ||||||
| [EST (Enrollment over Secure Transport) protocol](https://datatracker.ietf.org/doc/html/rfc7030) |  | ||||||
| for issuing and renewing leaf certificates. |  | ||||||
| 
 |  | ||||||
| ### EST Protocol Paths <EnterpriseAlert inline="true" /> |  | ||||||
| 
 |  | ||||||
| These are the EST protocol API paths currently supported from Vault's authentication |  | ||||||
| point of view. Note that the `cacerts` endpoint is unauthenticated. |  | ||||||
| 
 |  | ||||||
| @include 'pki-est-default-policy.mdx' |  | ||||||
| 
 |  | ||||||
| ### Read EST Configuration <EnterpriseAlert inline="true" /> |  | ||||||
| 
 |  | ||||||
| @include 'alerts/beta.mdx' |  | ||||||
| 
 |  | ||||||
| This endpoint fetches the current EST configuration. |  | ||||||
| 
 |  | ||||||
| | Method | Path             | |  | ||||||
| | :----- |:-----------------| |  | ||||||
| | `GET`  | `/pki/config/est` | |  | ||||||
| 
 |  | ||||||
| #### Sample request |  | ||||||
| 
 |  | ||||||
| ```shell-session |  | ||||||
| $ curl \ |  | ||||||
|     --header "X-Vault-Token: ..." \ |  | ||||||
|     http://127.0.0.1:8200/v1/pki/config/est |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample response |  | ||||||
| 
 |  | ||||||
| ```json |  | ||||||
| { |  | ||||||
|   "data": { |  | ||||||
|     "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"], |  | ||||||
|     "authenticators": { |  | ||||||
|       "cert": { |  | ||||||
|         "accessor": "auth_cert_7fe0c1cc", |  | ||||||
|         "cert_role": "est-ca" |  | ||||||
|       }, |  | ||||||
|       "userpass": { |  | ||||||
|         "accessor": "auth_userpass_2b333949" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     "default_mount": true, |  | ||||||
|     "default_path_policy": "sign-verbatim", |  | ||||||
|     "enable_sentinel_parsing": true, |  | ||||||
|     "enabled": true, |  | ||||||
|     "label_to_path_policy": { |  | ||||||
|       "test-label": "role:est-clients" |  | ||||||
|     }, |  | ||||||
|     "last_updated": "2024-01-31T10:45:22-05:00" |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### Set EST Configuration <EnterpriseAlert inline="true" /> |  | ||||||
| 
 |  | ||||||
| @include 'alerts/beta.mdx' |  | ||||||
| 
 |  | ||||||
| This endpoint will update EST related configuration, returning the |  | ||||||
| updated values as a response along with an updated `last_updated` field. |  | ||||||
| 
 |  | ||||||
| | Method | Path              | |  | ||||||
| |:-------|:------------------| |  | ||||||
| | `POST` | `/pki/config/est` | |  | ||||||
| 
 |  | ||||||
| #### Parameters |  | ||||||
| 
 |  | ||||||
| - `enabled` `(bool: false)` - Specifies whether EST is enabled or not. |  | ||||||
| 
 |  | ||||||
| - `default_mount` `(bool: false)` - Should this mount register the default .well-known/est URL path. |  | ||||||
|   Only a single mount can enable this across a Vault cluster |  | ||||||
| 
 |  | ||||||
| - `default_path_policy` `(string: "")` - Required to be set if `default_mount` is enabled. Specifies the |  | ||||||
|   behavior for requests using the default EST label. Can be `sign-verbatim` or a role given by `role:<role_name>`. |  | ||||||
| 
 |  | ||||||
| - `label_to_path_policy` `(map[string]string: "")` - Configures a pairing of an EST label with the redirected |  | ||||||
|  behavior for requests hitting that role. The path policy can be `sign-verbatim` or a role given by `role:<role_name>`. |  | ||||||
|  Labels must be unique across Vault cluster, and will register `.well-known/est/<label>` URL paths. |  | ||||||
| 
 |  | ||||||
| - `authenticators` `(map[string]map[string]string: "")` - Specifies the mount accessors EST should delegate authentication |  | ||||||
|  requests. Map keys can be either `cert` or `userpass`, with associated maps containing the key `accessor` with a value |  | ||||||
|  containing the auth mount's accessor. For the `cert` type, an optional key `cert_role` parameter is supported which |  | ||||||
|  will be passed as the [name](/vault/api-docs/auth/cert#name-6) parameter during certificate authentication attempts. |  | ||||||
| 
 |  | ||||||
| - `enable_sentinel_parsing` `(bool: false)` - Parse out fields from the provided CSR making them available for |  | ||||||
|  Sentinel policies. |  | ||||||
| 
 |  | ||||||
| - `audit_fields` `(list: ["common_name", "alt_names", "ip_sans", "uri_sans"])` - Fields parsed from the CSR that |  | ||||||
|  appear in the audit and can be used by sentinel policies. Allowed values are `csr`, `common_name`, `alt_names`, |  | ||||||
|  `ip_sans`, `uri_sans`, `other_sans`, `signature_bits`, `exclude_cn_from_sans`, `ou`, `organization`, `country`, |  | ||||||
|  `locality`, `province`, `street_address`, `postal_code`, `serial_number`, `use_pss`, `key_type`, `key_bits`, |  | ||||||
|  `add_basic_constraints` |  | ||||||
| 
 |  | ||||||
| #### Sample Payload |  | ||||||
| 
 |  | ||||||
| ```json |  | ||||||
| { |  | ||||||
|   "enabled": true, |  | ||||||
|   "default_mount": true, |  | ||||||
|   "label_to_path_policy": { |  | ||||||
|     "test-label": "role:est-clients", |  | ||||||
|     "sign-all": "sign-verbatim" |  | ||||||
|   }, |  | ||||||
|   "authenticators": { |  | ||||||
|     "cert": { |  | ||||||
|       "accessor": "auth_cert_0f1df449", |  | ||||||
|       "cert_role": "cert1" |  | ||||||
|     }, |  | ||||||
|     "userpass": { |  | ||||||
|       "accessor": "auth_userpass_b2b08fac" |  | ||||||
|     } |  | ||||||
|   }, |  | ||||||
|   "enable_sentinel_parsing": true, |  | ||||||
|   "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"] |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample request |  | ||||||
| 
 |  | ||||||
| ```shell-session |  | ||||||
| $ curl \ |  | ||||||
|     --header "X-Vault-Token: ..." \ |  | ||||||
|     --request POST \ |  | ||||||
|     --data @payload.json \ |  | ||||||
|     http://127.0.0.1:8200/v1/pki/config/est |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Sample response |  | ||||||
| 
 |  | ||||||
| ```json |  | ||||||
| { |  | ||||||
|   "data": { |  | ||||||
|     "authenticators": { |  | ||||||
|       "cert": { |  | ||||||
|         "accessor": "auth_cert_0f1df449", |  | ||||||
|         "cert_role": "cert1" |  | ||||||
|       }, |  | ||||||
|       "userpass": { |  | ||||||
|         "accessor": "auth_userpass_b2b08fac" |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     "default_mount": true, |  | ||||||
|     "default_path_policy": "sign-verbatim", |  | ||||||
|     "enabled": true, |  | ||||||
|     "label_to_path_policy": { |  | ||||||
|       "sign-all": "sign-verbatim", |  | ||||||
|       "test-label": "role:est-clients" |  | ||||||
|     }, |  | ||||||
|     "last_updated": "2024-02-02T10:49:20-05:00" |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
| ## Cluster scalability | ## Cluster scalability | ||||||
							
								
								
									
										664
									
								
								website/content/api-docs/secret/pki/issuance.mdx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										664
									
								
								website/content/api-docs/secret/pki/issuance.mdx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,664 @@ | |||||||
|  | --- | ||||||
|  | layout: api | ||||||
|  | page_title: PKI - Secrets Engines - Issuance Protocols | ||||||
|  | description: This is the API documentation for the issuance protocol support in Vault PKI. | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # Standard Issuance Protocols (API) | ||||||
|  |  | ||||||
|  | - [ACME Certificate Issuance](#acme-certificate-issuance) | ||||||
|  |   - [ACME Directories](#acme-directories) | ||||||
|  |   - [Get ACME EAB Binding Token](#get-acme-eab-binding-token) | ||||||
|  |   - [List Unused ACME EAB Binding Tokens](#list-unused-acme-eab-binding-tokens) | ||||||
|  |   - [Delete Unused ACME EAB Binding Tokens](#delete-unused-acme-eab-binding-tokens) | ||||||
|  |   - [Get ACME Configuration](#get-acme-configuration) | ||||||
|  |   - [Set ACME Configuration](#set-acme-configuration) | ||||||
|  | - [EST - Certificate Issuance <EnterpriseAlert inline="true" />](#est-certificate-issuance) | ||||||
|  |   - [EST Protocol Paths <EnterpriseAlert inline="true" />](#est-protocol-paths) | ||||||
|  |   - [Read EST Configuration <EnterpriseAlert inline="true" />](#read-est-configuration) | ||||||
|  |   - [Set EST Configuration <EnterpriseAlert inline="true" />](#set-est-configuration) | ||||||
|  | - [CMPv2 - Certificate Management Protocol (v2) <EnterpriseAlert inline="true"/>](#cmpv2-certificate-issuance) | ||||||
|  |   - [CMPv2 Protocol Paths <EnterpriseAlert inline="true" />](#cmpv2-protocol-paths) | ||||||
|  |   - [Read CMPv2 Configuration <EnterpriseAlert inline="true" />](#read-cmpv2-configuration) | ||||||
|  |   - [Set CMPv2 Configuration <EnterpriseAlert inline="true" />](#set-cmpv2-configuration) | ||||||
|  |  | ||||||
|  | ## ACME certificate issuance | ||||||
|  |  | ||||||
|  | Starting with Vault 1.14, Vault supports the [ACME certificate lifecycle | ||||||
|  | management protocol](https://datatracker.ietf.org/doc/html/rfc8555) for issuing | ||||||
|  | and renewing leaf server certificates. | ||||||
|  |  | ||||||
|  | In order to use ACME, a [cluster path](#set-cluster-configuration) must be | ||||||
|  | set and ACME must be [enabled in its configuration](#set-acme-configuration) | ||||||
|  | with the [required headers](#acme-required-headers) enabled on the mount | ||||||
|  | tuning. | ||||||
|  |  | ||||||
|  | Using ACME with a role requires `no_store=false` to be set on the role; this | ||||||
|  | allows the certificate to be stored and later fetched through the ACME | ||||||
|  | protocol. | ||||||
|  |  | ||||||
|  | ### ACME directories | ||||||
|  |  | ||||||
|  | Vault PKI supports the following ACME directories, providing different | ||||||
|  | restrictions around usage (defaults, a specific issuer and/or a specific | ||||||
|  | role). To interact with these directories, specify the directory URL in | ||||||
|  | an ACME client. For example, with the EFF's [CertBot](https://certbot.eff.org/): | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ certbot certonly --server https://localhost:8200/v1/pki/acme/directory ... | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | These endpoints are unauthenticated from a Vault authentication model, but | ||||||
|  | internally authenticated via the ACME protocol. | ||||||
|  |  | ||||||
|  | | Method | Path                                                               | Default Directory Policy   | Issuer                | Role          | | ||||||
|  | |:-------|:-------------------------------------------------------------------|:---------------------------|:----------------------|:--------------| | ||||||
|  | | `ACME` | `/pki/acme/directory`                                              | `sign-verbatim`            | `default`             | Sign-Verbatim | | ||||||
|  | | `ACME` | `/pki/acme/directory`                                              | `role:role_ref`            | Specified by the role | `:role_ref`   | | ||||||
|  | | `ACME` | `/pki/acme/directory`                                              | `external-policy(:policy)` | Specified by CIEPS    | CIEPS         | | ||||||
|  | | `ACME` | `/pki/issuer/:issuer_ref/acme/directory`                           | `sign-verbatim`            | `:issuer_ref`         | Sign-Verbatim | | ||||||
|  | | `ACME` | `/pki/issuer/:issuer_ref/acme/directory`                           | `role:role_ref`            | `:issuer_ref`         | `:role_ref`   | | ||||||
|  | | `ACME` | `/pki/roles/:role/acme/directory`                                  | (any)                      | Specified by the role | `:role`       | | ||||||
|  | | `ACME` | `/pki/issuer/:issuer_ref/roles/:role/acme/directory`               | (any)                      | `:issuer_ref`         | `:role`       | | ||||||
|  | | `ACME` | `/pki/external-policy(/:policy)/acme/directory`                    | (any)                      | Specified by CIEPS    | CIEPS         | | ||||||
|  | | `ACME` | `/pki/issuer/:issuer_ref/external-policy(/:policy)/acme/directory` | (any)                      | Specified by CIEPS    | CIEPS         | | ||||||
|  |  | ||||||
|  | When a role is not explicitly specified, behavior is specified by the | ||||||
|  | `default_directory_policy` in the [ACME configuration](#set-acme-configuration). | ||||||
|  | These directories can also be forbidden by setting that policy as `forbid`.  If | ||||||
|  | the policy is `sign-verbatim` then _any_ identifier for which the client can | ||||||
|  | prove ownership of will be issued for.  This is similar to using the | ||||||
|  | [Sign Verbatim](#sign-verbatim) endpoint, but with additional verification | ||||||
|  | that the client has proven ownership (within the ACME protocol) of the | ||||||
|  | requested certificate identifiers. When `external-policy` is specified as the | ||||||
|  | default value, the Certificate Issuance External | ||||||
|  | Policy Service (CIEPS)<EnterpriseAlert inline="true" /> is used for | ||||||
|  | validating and templating the certificate instead of a role; ACME's challenge | ||||||
|  | validation is still enforced. An optional policy name can be specified by using | ||||||
|  | `external-policy:policy`. Roles are not used when CIEPS is used. | ||||||
|  |  | ||||||
|  | #### ACME challenge types | ||||||
|  |  | ||||||
|  | Vault supports the following ACME challenge types presently: | ||||||
|  |  | ||||||
|  |  - `http-01`, supporting both `dns` and `ip` identifiers. | ||||||
|  |  - `dns-01`, supporting `dns` identifiers including wildcards. | ||||||
|  |  - `tls-alpn-01`, supporting only non-wildcard `dns` identifiers. | ||||||
|  |  | ||||||
|  | A custom DNS resolver used by the server for looking up DNS names for use | ||||||
|  | with both mechanisms can be added via the [ACME configuration](#set-acme-configuration). | ||||||
|  |  | ||||||
|  | #### ACME external account bindings | ||||||
|  |  | ||||||
|  | ACME External Account Binding (EAB) Policy can enforce that clients need to | ||||||
|  | have a valid external account binding to Vault. Before registering a new account, | ||||||
|  | an authenticated Vault client will need to [fetch a new EAB | ||||||
|  | token](#get-acme-eab-binding-token). This returns two values: a key identifier | ||||||
|  | and an HMAC key used by the ACME client to authenticate with EAB. For example: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ vault write -f /pki/acme/new-eab | ||||||
|  | $ certbot certonly --server https://localhost:8200/v1/pki/acme/directory \ | ||||||
|  |                    --eab-kid <id> --eab-hmac-key <hmac-key> | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | With or without EAB, requests from the ACME client are not authenticated using | ||||||
|  | traditional Vault authentication, but are instead authenticated through the | ||||||
|  | ACME protocol. With EAB however, a Vault authenticated client will have to | ||||||
|  | fetch an EAB token and pass it to the ACME client for use on the initial | ||||||
|  | registration: this binds the ACME client's registration to an authenticated | ||||||
|  | Vault endpoint, but not further to the client's entity or other information. | ||||||
|  |  | ||||||
|  | ~> Note: Enabling EAB is strongly recommended for public-facing Vault | ||||||
|  |    deployments. Use of the `VAULT_DISABLE_PUBLIC_ACME` environment variable | ||||||
|  |    can be used to enforce all ACME instances have EAB enabled. | ||||||
|  |  | ||||||
|  | #### ACME accounts | ||||||
|  |  | ||||||
|  | ACME Accounts are created specific to a particular directory and are not | ||||||
|  | portable across Performance Secondary clusters. | ||||||
|  |  | ||||||
|  | #### ACME required headers | ||||||
|  |  | ||||||
|  | ACME requires the following response headers (`allowed_response_headers`) | ||||||
|  | to be specified by [mount tuning](/vault/api-docs/system/mounts#tune-mount-configuration): | ||||||
|  |  | ||||||
|  |  - `Replay-Nonce` | ||||||
|  |  - `Link` | ||||||
|  |  - `Location` | ||||||
|  |  | ||||||
|  | On an existing mount, these can be specified by running the following command: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ vault secrets tune -allowed-response-headers=Location -allowed-response-headers=Replay-Nonce \ | ||||||
|  |                      -allowed-response-headers=Link \ | ||||||
|  |                      pki/ | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Get ACME EAB binding token | ||||||
|  |  | ||||||
|  | This endpoint returns a new ACME binding token. The `id` response field can | ||||||
|  | be used as the key identifier and the `key` response field be used as the | ||||||
|  | EAB HMAC key in the ACME Client. | ||||||
|  |  | ||||||
|  | Each call to this endpoint will generate and return a new EAB binding token | ||||||
|  | that is linked to the specific ACME directory it resides under. EAB tokens | ||||||
|  | are not usable across different ACME directories. | ||||||
|  |  | ||||||
|  | | Method | Path                                               | | ||||||
|  | |:-------|:---------------------------------------------------| | ||||||
|  | | `POST` | `/pki/acme/new-eab`                                | | ||||||
|  | | `POST` | `/pki/issuer/:issuer_ref/acme/new-eab`             | | ||||||
|  | | `POST` | `/pki/roles/:role/acme/new-eab`                    | | ||||||
|  | | `POST` | `/pki/issuer/:issuer_ref/roles/:role/acme/new-eab` | | ||||||
|  |  | ||||||
|  | #### Parameters | ||||||
|  |  | ||||||
|  | No parameters. | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     --request POST \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/acme/new-eab | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "created_on": "2023-05-24T14:33:00-04:00", | ||||||
|  |     "id": "bc8088d9-3816-5177-ae8e-d8393265f7dd", | ||||||
|  |     "key_type": "hs", | ||||||
|  |     "acme_directory": "acme/directory", | ||||||
|  |     "key": "MHcCAQE... additional data elided ...", | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### List unused ACME EAB binding tokens | ||||||
|  |  | ||||||
|  | This endpoint returns a list of all unused ACME binding tokens; once used, | ||||||
|  | they will be removed from this list. | ||||||
|  |  | ||||||
|  | | Method | Path       | | ||||||
|  | | :----- | :--------- | | ||||||
|  | | `LIST` | `/pki/eab` | | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     --request LIST \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/eab | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "key_info": { | ||||||
|  |       "bc8088d9-3816-5177-ae8e-d8393265f7dd": { | ||||||
|  |         "created_on": "2023-05-24T14:33:00-04:00", | ||||||
|  |         "key_type": "hs", | ||||||
|  |         "acme_directory": "acme/directory" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "keys": [ | ||||||
|  |       "bc8088d9-3816-5177-ae8e-d8393265f7dd" | ||||||
|  |     ] | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Delete unused ACME EAB binding tokens | ||||||
|  |  | ||||||
|  | This endpoint allows the deletion of an unused ACME binding token. | ||||||
|  |  | ||||||
|  | | Method   | Path               | | ||||||
|  | | :------- | :----------------- | | ||||||
|  | | `DELETE` | `/pki/eab/:key_id` | | ||||||
|  |  | ||||||
|  | #### Parameters | ||||||
|  |  | ||||||
|  |  - `key_id` `(string: <required>)` - The id of the EAB binding token to | ||||||
|  |    delete. This is part of the request URL. | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     --request DELETE \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/eab/bc8088d9-3816-5177-ae8e-d8393265f7dd | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Get ACME configuration | ||||||
|  |  | ||||||
|  | This endpoint allows reading of the current ACME server configuration used by | ||||||
|  | this mount. | ||||||
|  |  | ||||||
|  | | Method | Path               | | ||||||
|  | | :----- | :----------------- | | ||||||
|  | | `GET`  | `/pki/config/acme` | | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/config/acme | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "allowed_issuers": [ | ||||||
|  |       "*" | ||||||
|  |     ], | ||||||
|  |     "allowed_roles": [ | ||||||
|  |       "*" | ||||||
|  |     ], | ||||||
|  |     "default_directory_policy": "sign-verbatim", | ||||||
|  |     "dns_resolver": "", | ||||||
|  |     "eab_policy": "not-required", | ||||||
|  |     "enabled": true, | ||||||
|  |     "max_ttl": 776000 | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Set ACME configuration | ||||||
|  |  | ||||||
|  | This endpoint allows setting the ACME server configuration used by this | ||||||
|  | mount. | ||||||
|  |  | ||||||
|  | | Method | Path               | | ||||||
|  | | :----- | :----------------- | | ||||||
|  | | `POST` | `/pki/config/acme` | | ||||||
|  |  | ||||||
|  | #### Parameters | ||||||
|  |  | ||||||
|  |  - `allowed_issuers` `(list: ["*"])` - Specifies a list issuers allowed to | ||||||
|  |    issue certificates via explicit ACME paths. If an allowed role specifies | ||||||
|  |    an issuer outside this list, it will be allowed. The default value `*` | ||||||
|  |    allows every issuer within the mount. | ||||||
|  |  | ||||||
|  |   - `allow_role_ext_key_usage` `(bool: false)` - whether the ExtKeyUsage field | ||||||
|  |    from a role is used, defaults to false meaning that certificate will be | ||||||
|  |    signed with ServerAuth. | ||||||
|  |  | ||||||
|  |  - `allowed_roles` `(list: ["*"])` - Specifies a list of roles allowed to | ||||||
|  |    issue certificates via explicit ACME paths.  The default value `*` allows | ||||||
|  |    every role within the mount to be used.  If the `default_directory_policy` | ||||||
|  |    specifies a role, it must be allowed under this configuration. | ||||||
|  |  | ||||||
|  |  - `default_directory_policy` `(string: "sign-verbatim")` - Specifies the | ||||||
|  |    behavior of the default ACME directory.  Can be `forbid`, `sign-verbatim` | ||||||
|  |    or a role given by `role:<role_name>`.  If a role is used, it must be | ||||||
|  |    present in `allowed_roles`. | ||||||
|  |  | ||||||
|  |  - `dns_resolver` `(string: "")` - An optional overriding DNS resolver to | ||||||
|  |    use for challenge verification lookups. When not specified, the default | ||||||
|  |    system resolver will be used. This allows domains on peered networks with | ||||||
|  |    an accessible DNS resolver to be validated. | ||||||
|  |  | ||||||
|  |  - `eab_policy` `(string: "not-required")` - Specified policy to enforce | ||||||
|  |    around [External Account Bindings (EABs)](#acme-external-account-bindings). | ||||||
|  |    The allowed values are: | ||||||
|  |  | ||||||
|  |      - `not-required`, where EABs are not enforced but are validated if | ||||||
|  |         specified. | ||||||
|  |  | ||||||
|  |      - `new-account-required`, where new accounts are required to have EAB | ||||||
|  |        but existing accounts can still be used. | ||||||
|  |  | ||||||
|  |      - `always-required`, where all accounts regardless of age are required | ||||||
|  |        to have EABs set. | ||||||
|  |  | ||||||
|  |  - `enabled` `(bool: false)` - Whether ACME is enabled on this mount. When | ||||||
|  |    ACME is disabled, all requests to ACME directory URLs will return 404. | ||||||
|  |  | ||||||
|  |  - `max_ttl` `(string: "")` - Specifies the maximum Time To Live provided as a | ||||||
|  |    string duration with time suffix. Hour is the largest suffix. If not set, | ||||||
|  |    defaults to the previous hard-coded behavior of 90 days (2160 hours). | ||||||
|  |  | ||||||
|  | #### Sample payload | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | { | ||||||
|  |     "enabled": true | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     --request POST \ | ||||||
|  |     --data @payload.json \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/config/acme | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "allowed_issuers": [ | ||||||
|  |       "*" | ||||||
|  |     ], | ||||||
|  |     "allowed_roles": [ | ||||||
|  |       "*" | ||||||
|  |     ], | ||||||
|  |     "default_directory_policy": "sign-verbatim", | ||||||
|  |     "dns_resolver": "", | ||||||
|  |     "eab_policy": "not-required", | ||||||
|  |     "enabled": true | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## EST Certificate issuance <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | @include 'alerts/beta.mdx' | ||||||
|  |  | ||||||
|  | Within Vault Enterprise, support can be enabled for the | ||||||
|  | [EST (Enrollment over Secure Transport) protocol](https://datatracker.ietf.org/doc/html/rfc7030) | ||||||
|  | for issuing and renewing leaf certificates. | ||||||
|  |  | ||||||
|  | ### EST Protocol Paths <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | These are the EST protocol API paths currently supported from Vault's authentication | ||||||
|  | point of view. Note that the `cacerts` endpoint is unauthenticated. | ||||||
|  |  | ||||||
|  | @include 'pki-est-default-policy.mdx' | ||||||
|  |  | ||||||
|  | ### Read EST Configuration <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | @include 'alerts/beta.mdx' | ||||||
|  |  | ||||||
|  | This endpoint fetches the current EST configuration. | ||||||
|  |  | ||||||
|  | | Method | Path             | | ||||||
|  | | :----- |:-----------------| | ||||||
|  | | `GET`  | `/pki/config/est` | | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ```shell-session | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/config/est | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"], | ||||||
|  |     "authenticators": { | ||||||
|  |       "cert": { | ||||||
|  |         "accessor": "auth_cert_7fe0c1cc", | ||||||
|  |         "cert_role": "est-ca" | ||||||
|  |       }, | ||||||
|  |       "userpass": { | ||||||
|  |         "accessor": "auth_userpass_2b333949" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "default_mount": true, | ||||||
|  |     "default_path_policy": "sign-verbatim", | ||||||
|  |     "enable_sentinel_parsing": true, | ||||||
|  |     "enabled": true, | ||||||
|  |     "label_to_path_policy": { | ||||||
|  |       "test-label": "role:est-clients" | ||||||
|  |     }, | ||||||
|  |     "last_updated": "2024-01-31T10:45:22-05:00" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Set EST Configuration <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | @include 'alerts/beta.mdx' | ||||||
|  |  | ||||||
|  | This endpoint will update EST related configuration, returning the | ||||||
|  | updated values as a response along with an updated `last_updated` field. | ||||||
|  |  | ||||||
|  | | Method | Path              | | ||||||
|  | |:-------|:------------------| | ||||||
|  | | `POST` | `/pki/config/est` | | ||||||
|  |  | ||||||
|  | #### Parameters | ||||||
|  |  | ||||||
|  | - `enabled` `(bool: false)` - Specifies whether EST is enabled or not. | ||||||
|  |  | ||||||
|  | - `default_mount` `(bool: false)` - Should this mount register the default .well-known/est URL path. | ||||||
|  |   Only a single mount can enable this across a Vault cluster | ||||||
|  |  | ||||||
|  | - `default_path_policy` `(string: "")` - Required to be set if `default_mount` is enabled. Specifies the | ||||||
|  |   behavior for requests using the default EST label. Can be `sign-verbatim` or a role given by `role:<role_name>`. | ||||||
|  |  | ||||||
|  | - `label_to_path_policy` `(map[string]string: "")` - Configures a pairing of an EST label with the redirected | ||||||
|  |  behavior for requests hitting that role. The path policy can be `sign-verbatim` or a role given by `role:<role_name>`. | ||||||
|  |  Labels must be unique across Vault cluster, and will register `.well-known/est/<label>` URL paths. | ||||||
|  |  | ||||||
|  | - `authenticators` `(map[string]map[string]string: "")` - Specifies the mount accessors EST should delegate authentication | ||||||
|  |  requests. Map keys can be either `cert` or `userpass`, with associated maps containing the key `accessor` with a value | ||||||
|  |  containing the auth mount's accessor. For the `cert` type, an optional key `cert_role` parameter is supported which | ||||||
|  |  will be passed as the [name](/vault/api-docs/auth/cert#name-6) parameter during certificate authentication attempts. | ||||||
|  |  | ||||||
|  | - `enable_sentinel_parsing` `(bool: false)` - Parse out fields from the provided CSR making them available for | ||||||
|  |  Sentinel policies. | ||||||
|  |  | ||||||
|  | - `audit_fields` `(list: ["common_name", "alt_names", "ip_sans", "uri_sans"])` - Fields parsed from the CSR that | ||||||
|  |  appear in the audit and can be used by sentinel policies. Allowed values are `csr`, `common_name`, `alt_names`, | ||||||
|  |  `ip_sans`, `uri_sans`, `other_sans`, `signature_bits`, `exclude_cn_from_sans`, `ou`, `organization`, `country`, | ||||||
|  |  `locality`, `province`, `street_address`, `postal_code`, `serial_number`, `use_pss`, `key_type`, `key_bits`, | ||||||
|  |  `add_basic_constraints` | ||||||
|  |  | ||||||
|  | #### Sample Payload | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "enabled": true, | ||||||
|  |   "default_mount": true, | ||||||
|  |   "label_to_path_policy": { | ||||||
|  |     "test-label": "role:est-clients", | ||||||
|  |     "sign-all": "sign-verbatim" | ||||||
|  |   }, | ||||||
|  |   "authenticators": { | ||||||
|  |     "cert": { | ||||||
|  |       "accessor": "auth_cert_0f1df449", | ||||||
|  |       "cert_role": "cert1" | ||||||
|  |     }, | ||||||
|  |     "userpass": { | ||||||
|  |       "accessor": "auth_userpass_b2b08fac" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "enable_sentinel_parsing": true, | ||||||
|  |   "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"] | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ```shell-session | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     --request POST \ | ||||||
|  |     --data @payload.json \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/config/est | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "authenticators": { | ||||||
|  |       "cert": { | ||||||
|  |         "accessor": "auth_cert_0f1df449", | ||||||
|  |         "cert_role": "cert1" | ||||||
|  |       }, | ||||||
|  |       "userpass": { | ||||||
|  |         "accessor": "auth_userpass_b2b08fac" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "default_mount": true, | ||||||
|  |     "default_path_policy": "sign-verbatim", | ||||||
|  |     "enabled": true, | ||||||
|  |     "label_to_path_policy": { | ||||||
|  |       "sign-all": "sign-verbatim", | ||||||
|  |       "test-label": "role:est-clients" | ||||||
|  |     }, | ||||||
|  |     "last_updated": "2024-02-02T10:49:20-05:00" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## CMPv2 Certificate issuance <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | @include 'alerts/beta.mdx' | ||||||
|  |  | ||||||
|  | Within Vault Enterprise, support can be enabled for the | ||||||
|  | [CMPv2 (Certificate Management Protocol) protocol](https://datatracker.ietf.org/doc/html/rfc4210) | ||||||
|  | for issuing and renewing leaf certificates. | ||||||
|  |  | ||||||
|  | ### CMPv2 Protocol Paths <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | These are the CMP protocol API paths currently supported from Vault's authentication | ||||||
|  | point of view. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### Read CMPv2 Configuration <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | @include 'alerts/beta.mdx' | ||||||
|  |  | ||||||
|  | This endpoint fetches the current CMPv2 configuration. | ||||||
|  |  | ||||||
|  | | Method | Path              | | ||||||
|  | | :----- |:------------------| | ||||||
|  | | `GET`  | `/pki/config/cmp` | | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ```shell-session | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/config/cmp | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"], | ||||||
|  |     "default_path_policy": "role:example-role", | ||||||
|  |     "authenticators": { | ||||||
|  |       "cert": { | ||||||
|  |         "accessor": "auth_cert_7fe0c1cc", | ||||||
|  |         "cert_role": "cmp-ca" | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     "enable_sentinel_parsing": true, | ||||||
|  |     "enabled": true, | ||||||
|  |     "last_updated": "2024-01-31T10:45:22-05:00" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Set CMPv2 Configuration <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | @include 'alerts/beta.mdx' | ||||||
|  |  | ||||||
|  | This endpoint will update CMPv2 related configuration, returning the | ||||||
|  | updated values as a response along with an updated `last_updated` field. | ||||||
|  |  | ||||||
|  | | Method | Path              | | ||||||
|  | |:-------|:------------------| | ||||||
|  | | `POST` | `/pki/config/cmp` | | ||||||
|  |  | ||||||
|  | #### Parameters | ||||||
|  |  | ||||||
|  | - `enabled` `(bool: false)` - Specifies whether CMPv2 is enabled or not. | ||||||
|  |  | ||||||
|  | - `authenticators` `(map[string]map[string]string: "")` - Specifies the mount accessors CMPv2 should delegate authentication | ||||||
|  |  requests. Map key can only be `cert`, with associated value containing the key `accessor` with a value | ||||||
|  |  containing the auth mount's accessor. An optional key `cert_role` parameter is supported which | ||||||
|  |  will be passed as the [name](/vault/api-docs/auth/cert#name-6) parameter during certificate authentication attempts. | ||||||
|  |  | ||||||
|  | - `default_path_policy` `(string: required)`: Specify the default issuance policy | ||||||
|  |   when the non role based cmp path is called.  Must be set to either `sign-verbatim` | ||||||
|  |   (to issue via the sign-verbatim function) or `role:` followed by the name of a configured | ||||||
|  |   role. | ||||||
|  |  | ||||||
|  | - `enable_sentinel_parsing` `(bool: false)` - Parse out fields from the provided CSR making them available for | ||||||
|  |  Sentinel policies. | ||||||
|  |  | ||||||
|  | - `audit_fields` `(list: ["common_name", "alt_names", "ip_sans", "uri_sans"])` - Fields parsed from the CSR that | ||||||
|  |  appear in the audit and can be used by sentinel policies. Allowed values are `csr`, `common_name`, `alt_names`, | ||||||
|  |  `ip_sans`, `uri_sans`, `other_sans`, `signature_bits`, `exclude_cn_from_sans`, `ou`, `organization`, `country`, | ||||||
|  |  `locality`, `province`, `street_address`, `postal_code`, `serial_number`, `use_pss`, `key_type`, `key_bits`, | ||||||
|  |  `add_basic_constraints` | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #### Sample Payload | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "enabled": true, | ||||||
|  |   "authenticators": { | ||||||
|  |     "cert": { | ||||||
|  |       "accessor": "auth_cert_0f1df449", | ||||||
|  |       "cert_role": "cert1" | ||||||
|  |     }, | ||||||
|  |    "default_path_policy": "sign-verbatim", | ||||||
|  |    "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"], | ||||||
|  |    "enable_sentinel_parsing": true | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample request | ||||||
|  |  | ||||||
|  | ```shell-session | ||||||
|  | $ curl \ | ||||||
|  |     --header "X-Vault-Token: ..." \ | ||||||
|  |     --request POST \ | ||||||
|  |     --data @payload.json \ | ||||||
|  |     http://127.0.0.1:8200/v1/pki/config/cmp | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Sample response | ||||||
|  |  | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |   "data": { | ||||||
|  |     "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"], | ||||||
|  |     "authenticators": { | ||||||
|  |       "cert": { | ||||||
|  |         "accessor": "auth_cert_0f1df449", | ||||||
|  |         "cert_role": "cert1" | ||||||
|  |       }, | ||||||
|  |     "default_path_policy": "sign-verbatim", | ||||||
|  |     "enabled": true, | ||||||
|  |     "enable_sentinel_parsing": true, | ||||||
|  |     "last_updated": "2024-02-02T10:49:20-05:00" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										144
									
								
								website/content/docs/secrets/pki/cmpv2.mdx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								website/content/docs/secrets/pki/cmpv2.mdx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | |||||||
|  | --- | ||||||
|  | layout: docs | ||||||
|  | page_title: Certificate Management Protocol v2 (CMPv2) within Vault | PKI - Secrets Engines | ||||||
|  | description: An overview of the Certificate Management Protocol (v2) implementation within Vault. | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | # PKI secrets engine - Certificate Management Protocol v2 (CMPv2) <EnterpriseAlert inline="true" /> | ||||||
|  |  | ||||||
|  | This document summarizes Vault's PKI Secrets Engine | ||||||
|  | implementation of the [CMPv2 protocol](https://datatracker.ietf.org/doc/html/rfc4210) <EnterpriseAlert inline="true" />, | ||||||
|  | its configuration, and limitations. | ||||||
|  |  | ||||||
|  | ## What is Certificate Management Protocol v2 (CMPv2)? | ||||||
|  |  | ||||||
|  | The CMP protocol is an IETF standardized protocol, [RFC 4210](https://datatracker.ietf.org/doc/html/rfc4210), | ||||||
|  | that allows clients to acquire client certificates and their associated Certificate | ||||||
|  | Authority (CA) certficates. | ||||||
|  |  | ||||||
|  | ## Enabling CMPv2 support on a Vault PKI mount | ||||||
|  |  | ||||||
|  | To configure an existing mount to serve CMPv2 clients, the following steps are | ||||||
|  | required, which are broken down into three main categories: | ||||||
|  |  | ||||||
|  |  1. [Configuring an Issuer](#configuring-an-issuer) | ||||||
|  |  1. [Authentication mechanisms](#configuring-cmpv2-authentication) | ||||||
|  |  1. [Updating PKI tunable parameters](#updating-the-pki-mount-tunable-parameters) | ||||||
|  |  1. [PKI CMPv2 configuration](#enabling-cmpv2) | ||||||
|  |  | ||||||
|  | ### Configuring an Issuer | ||||||
|  |  | ||||||
|  | CMPv2 is a bit unique, in that it uses the Issuer CA certificate to sign the | ||||||
|  | CMP messages.  This means your issuer must have the `DigitalSignature` key | ||||||
|  | usage. | ||||||
|  | Existing CA issuers likely do not have this, so you will need to generate a new  | ||||||
|  | issuer (likely an intermediate) that has this property.  If you are configuring PKI  | ||||||
|  | for the first time or creating a new issuer, ensure you set `key_usage` to, | ||||||
|  | as an example, `CRL,CASign,DigitalSignature`. | ||||||
|  |  | ||||||
|  | See [Generate intermediate CSR](/vault/api-docs/secret/pki#generate-intermediate-csr) | ||||||
|  |  | ||||||
|  | ### Configuring CMPv2 Authentication | ||||||
|  |  | ||||||
|  | At this time, Vault's implementation of CMPv2 supports only  | ||||||
|  | [Certificate TLS authentication](/vault/docs/auth/cert), where clients proof | ||||||
|  | of posession of a TLS client certificate authenticates them to Vault. | ||||||
|  |  | ||||||
|  | Authentication leverages a separate Vault authentication | ||||||
|  | mount, within the same namespace, to validate the client provided credentials | ||||||
|  | along with the client's ACL policy to enforce.  | ||||||
|  |  | ||||||
|  | For proper accounting, a mount supporting CMPv2 authentication should be | ||||||
|  | dedicated to this purpose, not shared with other workflows.  In other words, | ||||||
|  | create a new certificate auth mount for CMPv2 even if you already have one  | ||||||
|  | another in use for other purposes. | ||||||
|  |  | ||||||
|  | When setting up the authentication mount for CMPv2 clients, the token type must | ||||||
|  | be configured to return [batch tokens](/vault/docs/concepts/tokens#batch-tokens). | ||||||
|  | Batch tokens are required to avoid an excessive amount of leases being generated | ||||||
|  | and persisted as every CMPv2 incoming request needs to be authenticated. | ||||||
|  |  | ||||||
|  | The path within an ACL policy must match the `cmp` path underneath the  | ||||||
|  | PKI mount.  The path to use can be the default `cmp` path or a role based one. | ||||||
|  |  | ||||||
|  | If using the `sign-verbatim` as a path policy, the following | ||||||
|  | ACL policy will allow an authenticated client access the required PKI CMP path. | ||||||
|  | ``` | ||||||
|  | path “pki/cmp” { | ||||||
|  |   capabilities=[“update”, “create”] | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | For a role base path policy, this sample policy can be used | ||||||
|  | ``` | ||||||
|  | path “pki/roles/my-role-name/cmp” { | ||||||
|  |   capabilities=[“update”, “create”] | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Updating the PKI mount tunable parameters | ||||||
|  |  | ||||||
|  | Once the authentication mount has been created and configured, the authentication mount's accessor | ||||||
|  | will need to be captured and added within the PKI mount's [delegated auth accessors](/vault/api-docs/system/mounts#delegated_auth_accessors). | ||||||
|  |  | ||||||
|  | To get an authentication mount's accessor field, the following command can be used. | ||||||
|  |  | ||||||
|  | ```shell-session | ||||||
|  | $ vault read -field=accessor sys/auth/auth/cert | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | For CMP to work within certain clients, a few response headers need to be explicitly allowed | ||||||
|  | along with configuring the list of accessors the mount can delegate authentication towards. | ||||||
|  | The following will grant the required response headers, you will need to replace the values for the `delegated-auth-accessors` | ||||||
|  | to match your values. | ||||||
|  |  | ||||||
|  | ```shell-session | ||||||
|  | $ vault secrets tune \ | ||||||
|  |   -allowed-response-headers="Content-Transfer-Encoding" \ | ||||||
|  |   -allowed-response-headers="Content-Length" \ | ||||||
|  |   -allowed-response-headers="WWW-Authenticate" \ | ||||||
|  |   -delegated-auth-accessors="auth_cert_4088ac2d" \ | ||||||
|  |   pki | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | #### Enabling CMPv2 | ||||||
|  |  | ||||||
|  | Enabling CMP is a matter of writing to the `config/cmp` endpoint, to set it | ||||||
|  | enabled and configure default path policy and authentication. | ||||||
|  |  | ||||||
|  | ```shell-session | ||||||
|  | vault write pki/config/cmp -<<EOC | ||||||
|  | { | ||||||
|  |   "enabled": true, | ||||||
|  |   "default_path_policy": "role:example-role", | ||||||
|  |   "authenticators": { | ||||||
|  |     "cert": { | ||||||
|  |       "accessor": "auth_cert_4088ac2d" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "audit_fields": ["common_name", "alt_names", "ip_sans", "uri_sans"] | ||||||
|  | } | ||||||
|  | EOC | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Of course, substituting your own role and accessor values.  After this, the | ||||||
|  | CMP endpoints will be able to handle client requests, authenticated with the  | ||||||
|  | previously configured Cert Auth method. | ||||||
|  |  | ||||||
|  | ## Limitations | ||||||
|  |  | ||||||
|  | The initial release of CMPv2 support is intentionally limited to a subset of the | ||||||
|  | protocol, covering Initialization, Certification, and Key Update, over HTTP. | ||||||
|  | In particular, the following are not yet supported: | ||||||
|  |  | ||||||
|  |  * Basic authentication scheme using PasswordBasedMac | ||||||
|  |  * Revocation | ||||||
|  |  * CRL fetching via CMP itself. | ||||||
|  |  * CA creation/update operations. | ||||||
|  |  | ||||||
|  | Note that CMPv2 is not integrated with these existing Vault PKI features: | ||||||
|  |   | ||||||
|  |  * Certificate Metadata - CMPv2 has no means of providing metadata. | ||||||
|  |  * Certificate Issuance External Policy Service [(CIEPS)](/vault/docs/secrets/pki/cieps) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -41,17 +41,23 @@ The PKI Secrets Engine documentation is split into the following pieces: | |||||||
|  - [Considerations](/vault/docs/secrets/pki/considerations) - A list of helpful |  - [Considerations](/vault/docs/secrets/pki/considerations) - A list of helpful | ||||||
|    considerations to keep in mind when using and operating the PKI Secrets |    considerations to keep in mind when using and operating the PKI Secrets | ||||||
|    Engine. |    Engine. | ||||||
|  - [Troubleshooting ACME](/vault/docs/secrets/pki/troubleshooting-acme) - A list of |  | ||||||
|    advice for troubleshooting failures with ACME issuance and Vault PKI. |  | ||||||
|  - [Rotation Primitives](/vault/docs/secrets/pki/rotation-primitives) - A document |  - [Rotation Primitives](/vault/docs/secrets/pki/rotation-primitives) - A document | ||||||
|    which explains different types of certificates used to achieve rotation. |    which explains different types of certificates used to achieve rotation. | ||||||
|  - [CIEPS Protocol <EnterpriseAlert inline="true" />](/vault/docs/secrets/pki/cieps) - A |  - [CIEPS Protocol <EnterpriseAlert inline="true" />](/vault/docs/secrets/pki/cieps) - A | ||||||
|    document which explains the Certificate Issuance External Policy Service (CIEPS) |    document which explains the Certificate Issuance External Policy Service (CIEPS) | ||||||
|    protocol (request and response structure), along with an overview of the difference |    protocol (request and response structure), along with an overview of the difference | ||||||
|    between it and `/pki/sign-verbatim`. |    between it and `/pki/sign-verbatim`. | ||||||
| - [EST Protocol <EnterpriseAlert inline="true" />](/vault/docs/secrets/pki/est) - A |  - Issuance Protocols: Using standard certificate management protocols with Vault PKI. | ||||||
|    document which explains Vault's implementation of the EST protocol, from configuration |    - [EST <EnterpriseAlert inline="true" />](/vault/docs/secrets/pki/est) -  | ||||||
|    to limitations. |      Explains Vault's implementation of the EST protocol, from configuration | ||||||
|  |      to limitations. | ||||||
|  |    - [CMPv2 <EnterpriseAlert inline="true" />](/vault/docs/secrets/pki/cmpv2) - | ||||||
|  |      Explains Vault's implementation of the CMPv2 protocol, from configuration | ||||||
|  |      to limitations. | ||||||
|  |    - [Troubleshooting ACME](/vault/docs/secrets/pki/troubleshooting-acme) - A list of | ||||||
|  |      advice for troubleshooting failures with ACME issuance and Vault PKI. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## Tutorial | ## Tutorial | ||||||
|  |  | ||||||
|   | |||||||
| @@ -259,7 +259,16 @@ | |||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         "title": "PKI", |         "title": "PKI", | ||||||
|         "path": "secret/pki" |         "routes": [ | ||||||
|  |           { | ||||||
|  |             "title": "Overview", | ||||||
|  |             "path": "secret/pki" | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             "title": "Issuance Protocols", | ||||||
|  |             "path": "secret/pki/issuance" | ||||||
|  |           } | ||||||
|  |         ] | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         "title": "RabbitMQ", |         "title": "RabbitMQ", | ||||||
|   | |||||||
| @@ -1592,11 +1592,6 @@ | |||||||
|             "title": "Considerations", |             "title": "Considerations", | ||||||
|             "path": "secrets/pki/considerations" |             "path": "secrets/pki/considerations" | ||||||
|           }, |           }, | ||||||
|           { |  | ||||||
|             "title": "Troubleshooting ACME integration", |  | ||||||
|             "path": "secrets/pki/troubleshooting-acme" |  | ||||||
|           }, |  | ||||||
|  |  | ||||||
|           { |           { | ||||||
|             "title": "Rotation Primitives", |             "title": "Rotation Primitives", | ||||||
|             "path": "secrets/pki/rotation-primitives" |             "path": "secrets/pki/rotation-primitives" | ||||||
| @@ -1618,6 +1613,19 @@ | |||||||
|               "color": "highlight" |               "color": "highlight" | ||||||
|             }, |             }, | ||||||
|             "path": "secrets/pki/est" |             "path": "secrets/pki/est" | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             "title": "Certificate Management Protocol (CMPv2)", | ||||||
|  |             "badge": { | ||||||
|  |               "text": "BETA", | ||||||
|  |               "type": "outlined", | ||||||
|  |               "color": "highlight" | ||||||
|  |             }, | ||||||
|  |             "path": "secrets/pki/cmpv2" | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             "title": "Troubleshooting ACME", | ||||||
|  |             "path": "secrets/pki/troubleshooting-acme" | ||||||
|           } |           } | ||||||
|         ] |         ] | ||||||
|       }, |       }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Scott Miller
					Scott Miller