When to use the Infisical Issuer instead of ACME
- You want to authenticate with a machine identity (Universal Auth or Kubernetes Auth) rather than ACME/EAB credentials.
- You want the CA chain populated in the Secret’s
ca.crtautomatically (with the ACME issuer this is not automatic and needs extra setup such as trust-manager). - You do not want ACME domain-ownership challenges (HTTP-01/DNS-01).
- You are issuing workload identity certificates (for example
spiffe://URIs for service meshes).
How It Works
- Install cert-manager and the Infisical Issuer controller in your Kubernetes cluster.
- Create an
Issuer(orClusterIssuer) that authenticates to Infisical with a machine identity and points at your PKI Application and Profile. - Create
Certificateresources that define the certificates you need. - cert-manager approves each request and the Infisical Issuer signs it through Infisical, storing the certificate, private key, and CA chain in a Secret.
- Certificates are automatically renewed before expiration.
Guide
Throughout this guide, replace<namespace> with the namespace where your workloads and certificates live. With a namespaced Issuer, its credentials Secret, the Issuer, and the Certificate all live in this namespace. To issue across namespaces from a single resource, use a ClusterIssuer instead, whose Secret and service account live in the controller’s namespace rather than alongside each workload.
Set up your Infisical PKI Application and machine identity
- A PKI Application with a Certificate Profile that uses API enrollment. Note the Application name (for example
web-services) and the Profile name (for exampleweb-server); you reference both by name when you create theIssuer. - A machine identity added to the Application with the operator role, which lets it issue certificates.
- Universal Auth: use the identity’s Client ID and Client Secret.
- Kubernetes Auth: the controller mints a short-lived token for a Kubernetes service account and presents it to Infisical. Configure it on the identity first, and note its Identity ID.
Install cert-manager
Install the Infisical Issuer
Issuer and ClusterIssuer custom resources in the infisical-issuer.infisical.com API group. Confirm the controller is running:Allow cert-manager to approve Infisical Issuer requests
CertificateRequest once it has been approved. Its built-in approver approves requests for the standard cert-manager issuer types, but for an external issuer you must explicitly grant it permission to approve requests for the Infisical Issuer’s signers. Apply the following once:Certificate resources stay pending because their CertificateRequest is never approved, so the Infisical Issuer never signs it. Adjust the ServiceAccount name and namespace if your cert-manager runs under different ones.Store your machine identity credentials in a Secret
Secret holding your machine identity credentials, in the namespace where you will issue certificates.- Universal Auth
- Kubernetes Auth
Create the Infisical Issuer
Issuer (or ClusterIssuer) referencing your Application and Profile by name, and the credentials Secret from the previous step.- Universal Auth
- Kubernetes Auth
Ready condition:True, run kubectl describe issuers.infisical-issuer.infisical.com infisical-issuer -n <namespace> and read the Ready condition message for the reason (for example a missing secret, or an unknown Application or Profile).- An
Issueris namespace-scoped: certificates can only be issued from anIssuerin the same namespace as theCertificate. Its referenced Secrets (and service account) must live in that same namespace; cross-namespace references are rejected. - To issue across namespaces with one resource, create a
ClusterIssuerinstead. The spec is identical exceptkind: ClusterIssuerand nometadata.namespace. Because aClusterIssuerhas no namespace of its own, its referenced Secrets and service account must live in the controller’s namespace (the one the issuer is installed into, configurable with the controller’s--cluster-resource-namespaceflag), and each reference’snamespacemust match it. - For a self-hosted Infisical that uses a private CA, add a
tlsblock so the controller trusts it:
Create the Certificate
Certificate that references the Infisical Issuer. The issuerRef.group must be infisical-issuer.infisical.com.uris SAN and make sure the Certificate Profile policy allows URI SANs:Use the certificate
secretName:tls.crt (the issued certificate plus any intermediates), tls.key (the private key), and ca.crt (the root CA). You can decode the certificate with openssl:FAQ
Which authentication method should I use?
Which authentication method should I use?
- Universal Auth is the simplest: store a Client ID and Client Secret in a Secret. Good for any cluster.
- Kubernetes Auth avoids storing a long-lived secret: the controller mints a short-lived token for a Kubernetes service account, and Infisical validates it against your cluster. Prefer this when you want to bind issuance to a service account rather than a static secret. It requires configuring Kubernetes Auth on the identity first.
Why is my certificate duration different from what I requested?
Why is my certificate duration different from what I requested?
duration is rounded down to whole hours (with a one-hour minimum). The effective lifetime is also clamped to the maximum validity allowed by the Certificate Profile’s policy. If you omit duration entirely, the Profile’s default TTL is used.My CertificateRequest is stuck waiting for approval.
My CertificateRequest is stuck waiting for approval.
ClusterRole and ClusterRoleBinding from Step 4, and that the ServiceAccount subject matches your cert-manager installation (name and namespace).Can certificates be renewed automatically?
Can certificates be renewed automatically?
renewBefore threshold on the Certificate. A renewal is just a new request that the Infisical Issuer signs, so no extra configuration is needed.