Vault Certificate Resolver

The Vault certificate resolver allows Traefik Enterprise to use a Vault server with the PKI secret engine enabled as a certificate resolver. This is a brief overview of how to configure Vault PKI. For a more in-depth tutorial, consult the user guide

In order to use the Vault certificate resolver, Traefik Enterprise needs access to a Vault server with the PKI secret engine enabled and set up. You can find more information on how to do so here. Note that the role used by the Vault certificate resolver needs to be configured with at least one of ttl or max_ttl explicitly set.

Once the Vault server is ready, a Vault certificate resolver can be added in Traefik Enterprise's static configuration:

certificatesResolvers:
  resolverName:
    vault:
      url: "http://127.0.0.1:8200"
      token: "s.CUDDqqjiIFXF60KVSeJOxeb5"
      enginePath: "pki"
      role: "vault-role"
[certificatesResolvers.resolverName.vault]
  url = "http://127.0.0.1:8200"
  token = "s.CUDDqqjiIFXF60KVSeJOxeb5"
  enginePath = "pki"
  role = "vault-role"

Next, define a router that references this certificate resolver:

labels:
  - "traefik.http.routers.routerName.rules=Host(`example.com`)"
  - "traefik.http.routers.routerName.tls.certResolver=resolverName"
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: example
spec:
  routes:
    - match: Host(`example.com`)
      kind: Rule
  tls:
    certResolver: resolverName
- "traefik.http.routers.routerName.rules=Host(`example.com`)"
- "traefik.http.routers.routerName.tls.certResolver=resolverName"
"labels": {
    "traefik.http.routers.routerName.rules": "Host(`example.com`)",
    "traefik.http.routers.routerName.tls.certResolver": "resolverName"
}
labels:
  - "traefik.http.routers.routerName.rules=Host(`example.com`)"
  - "traefik.http.routers.routerName.tls.certResolver=resolverName"
http:
  routers:
    routerName:
      rules: "Host(`example.com`)"
      tls:
        certResolver: "resolverName"
[http.routers]
  [http.routers.routerName]
    rules = "Host(`example.com`)"
    [http.routers.routerName.tls]
      certResolver = "resolverName"

Certificates are generated accordingly to the role configuration. This means their maximum time-to-live (TTL) is equal to either the ttl or the max_ttl of the role, whichever has the lowest value.

Once a certificate reaches ⅔ of its lifetime, the Vault certificate resolver tries to renew it. If this operation fails, the old certificate will continue to be served until it expires or another renewal attempt succeeds.

Changing the role's TTL

The Vault certificate resolver regularly verifies if the role configuration has been modified. If the lowest value between ttl and max_ttl is changed, a renewal process starts for all certificates issued by the certificate resolver. This is done so certificates handled by the resolver always reflect the role configuration.

Certificate Resolver Configuration

url

Required, Default=""

Defines the URL of the Vault server, including the scheme and port.

certificatesResolvers:
  resolverName:
    vault:
      url: "http://127.0.0.1:8200"
[certificatesResolvers.resolverName.vault]
  url = "http://127.0.0.1:8200"

token

Required, Default=""

Defines the token to authenticate with Vault.

Supported Authentication Mechanisms

The Vault certificate resolver currently supports token authentication only.

certificatesResolvers:
  resolverName:
    vault:
      token: "s.CUDDqqjiIFXF60KVSeJOxeb5"
[certificatesResolvers.resolverName.vault]
  token = "s.CUDDqqjiIFXF60KVSeJOxeb5"

enginePath

Optional, Default="pki"

Defines the path under which the PKI secret engine is enabled.

certificatesResolvers:
  resolverName:
    vault:
      enginePath: "pki"
[certificatesResolvers.resolverName.vault]
  enginePath = "pki"

role

Required, Default=""

The role used to issue certificates.

Role configuration

The role used by the Vault certificate resolver needs to be configured with at least one of ttl or max_ttl explicitly set. These are used to know the maximum time-to-live (TTL) of certificates.

certificatesResolvers:
  resolverName:
    vault:
      role: "vault-role"
[certificatesResolvers.resolverName.vault]
  role = "vault-role"