--- title: Automatically Rotating Webhook TLS Credentials description: Use cert-manager to automatically rotate webhook TLS credentials. --- The Linkerd control plane contains several components, called webhooks, which are called directly by Kubernetes itself. The traffic from Kubernetes to the Linkerd webhooks is secured with TLS and therefore each of the webhooks requires a secret containing TLS credentials. These certificates are different from the ones that the Linkerd proxies use to secure pod-to-pod communication and use a completely separate trust chain. For more information on rotating the TLS credentials used by the Linkerd proxies, see [Automatically Rotating Control Plane TLS Credentials](automatically-rotating-control-plane-tls-credentials/). By default, when Linkerd is installed with the Linkerd CLI or with the Linkerd Helm chart, TLS credentials are automatically generated for all of the webhooks. If these certificates expire or need to be regenerated for any reason, performing a [Linkerd upgrade](upgrade/) (using the Linkerd CLI or using Helm) will regenerate them. This workflow is suitable for most users. However, if you need these webhook certificates to be rotated automatically on a regular basis, it is possible to use cert-manager to automatically manage them. {{< docs/production-note >}} ## Install Cert manager As a first step, [install cert-manager on your cluster](https://cert-manager.io/docs/installation/) and create the namespaces that cert-manager will use to store its webhook-related resources. For simplicity, we suggest using the default namespace linkerd uses: ```bash # control plane core kubectl create namespace linkerd kubectl label namespace linkerd \ linkerd.io/is-control-plane=true \ config.linkerd.io/admission-webhooks=disabled \ linkerd.io/control-plane-ns=linkerd kubectl annotate namespace linkerd linkerd.io/inject=disabled # viz (ignore if not using the viz extension) kubectl create namespace linkerd-viz kubectl label namespace linkerd-viz linkerd.io/extension=viz # jaeger (ignore if not using the jaeger extension) kubectl create namespace linkerd-jaeger kubectl label namespace linkerd-jaeger linkerd.io/extension=jaeger ``` ## Save the signing key pair as a Secret Next, we will use the [`step`](https://smallstep.com/cli/) tool, to create a signing key pair which will be used to sign each of the webhook certificates: ```bash step certificate create webhook.linkerd.cluster.local ca.crt ca.key \ --profile root-ca --no-password --insecure --san webhook.linkerd.cluster.local kubectl create secret tls webhook-issuer-tls --cert=ca.crt --key=ca.key --namespace=linkerd # ignore if not using the viz extension kubectl create secret tls webhook-issuer-tls --cert=ca.crt --key=ca.key --namespace=linkerd-viz # ignore if not using the jaeger extension kubectl create secret tls webhook-issuer-tls --cert=ca.crt --key=ca.key --namespace=linkerd-jaeger ``` ## Create Issuers referencing the secrets With the Secrets in place, we can create cert-manager "Issuer" resources that reference them: ```bash kubectl apply -f - <}} When installing the `linkerd-control-plane` chart, you _must_ provide the issuer trust root and issuer credentials as described in [Installing Linkerd with Helm](install-helm/). {{< /note >}} See [Automatically Rotating Control Plane TLS Credentials](automatically-rotating-control-plane-tls-credentials/) for details on how to do something similar for control plane credentials.