Cert-Manager · Schema

cert-manager Issuer and ClusterIssuer

JSON Schema for cert-manager Issuer and ClusterIssuer custom resources (cert-manager.io/v1). An Issuer represents a certificate authority scoped to a single namespace, while a ClusterIssuer is cluster-scoped and can serve Certificate resources across all namespaces. Both resources configure the backend certificate authority connection including ACME, CA, SelfSigned, Vault, and Venafi issuer types.

CertificatesCloud-NativeGraduatedKubernetesSecurityTLS

Properties

Name Type Description
apiVersion string The cert-manager API version.
kind string The resource kind: Issuer (namespace-scoped) or ClusterIssuer (cluster-scoped).
metadata object Kubernetes ObjectMeta for the Issuer or ClusterIssuer resource.
spec object
status object
View JSON Schema on GitHub

JSON Schema

cert-manager-issuer-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://github.com/api-evangelist/cert-manager/blob/main/json-schema/cert-manager-issuer-schema.json",
  "title": "cert-manager Issuer and ClusterIssuer",
  "description": "JSON Schema for cert-manager Issuer and ClusterIssuer custom resources (cert-manager.io/v1). An Issuer represents a certificate authority scoped to a single namespace, while a ClusterIssuer is cluster-scoped and can serve Certificate resources across all namespaces. Both resources configure the backend certificate authority connection including ACME, CA, SelfSigned, Vault, and Venafi issuer types.",
  "type": "object",
  "required": ["apiVersion", "kind", "metadata", "spec"],
  "properties": {
    "apiVersion": {
      "type": "string",
      "description": "The cert-manager API version.",
      "const": "cert-manager.io/v1"
    },
    "kind": {
      "type": "string",
      "description": "The resource kind: Issuer (namespace-scoped) or ClusterIssuer (cluster-scoped).",
      "enum": ["Issuer", "ClusterIssuer"]
    },
    "metadata": {
      "type": "object",
      "description": "Kubernetes ObjectMeta for the Issuer or ClusterIssuer resource.",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the Issuer or ClusterIssuer resource.",
          "minLength": 1,
          "maxLength": 253
        },
        "namespace": {
          "type": "string",
          "description": "Namespace for Issuer resources. Not used for ClusterIssuer."
        },
        "labels": {
          "type": "object",
          "description": "Kubernetes labels.",
          "additionalProperties": { "type": "string" }
        }
      }
    },
    "spec": {
      "$ref": "#/$defs/IssuerSpec"
    },
    "status": {
      "$ref": "#/$defs/IssuerStatus"
    }
  },
  "$defs": {
    "IssuerSpec": {
      "type": "object",
      "description": "Desired state of the Issuer or ClusterIssuer resource. Exactly one issuer type must be configured: acme, ca, selfSigned, vault, or venafi.",
      "properties": {
        "acme": {
          "$ref": "#/$defs/ACMEIssuer"
        },
        "ca": {
          "$ref": "#/$defs/CAIssuer"
        },
        "selfSigned": {
          "$ref": "#/$defs/SelfSignedIssuer"
        },
        "vault": {
          "$ref": "#/$defs/VaultIssuer"
        },
        "venafi": {
          "$ref": "#/$defs/VenafiIssuer"
        }
      }
    },
    "ACMEIssuer": {
      "type": "object",
      "description": "Configuration for an ACME (RFC 8555) certificate authority such as Let's Encrypt, ZeroSSL, or a private ACME server. ACME issuers obtain certificates by completing DNS or HTTP challenges proving domain ownership.",
      "required": ["server", "privateKeySecretRef"],
      "properties": {
        "server": {
          "type": "string",
          "format": "uri",
          "description": "URL of the ACME server's directory endpoint. For Let's Encrypt production: https://acme-v02.api.letsencrypt.org/directory. For Let's Encrypt staging: https://acme-staging-v02.api.letsencrypt.org/directory."
        },
        "email": {
          "type": "string",
          "format": "email",
          "description": "Email address for the ACME account registration. Used for expiry notifications from the CA."
        },
        "externalAccountBinding": {
          "type": "object",
          "description": "Optional External Account Binding (EAB) configuration required by some ACME providers (e.g., ZeroSSL) to associate the ACME account with an existing account in the CA's system.",
          "required": ["keyID", "keySecretRef"],
          "properties": {
            "keyID": {
              "type": "string",
              "description": "The key identifier provided by the CA for EAB."
            },
            "keySecretRef": {
              "type": "object",
              "description": "Reference to a Secret containing the EAB HMAC key.",
              "required": ["name", "key"],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the Secret."
                },
                "key": {
                  "type": "string",
                  "description": "Key within the Secret containing the HMAC key value."
                }
              }
            },
            "keyAlgorithm": {
              "type": "string",
              "description": "HMAC algorithm used for the EAB key.",
              "enum": ["HS256", "HS384", "HS512"]
            }
          }
        },
        "privateKeySecretRef": {
          "type": "object",
          "description": "Reference to the Secret where the ACME account private key is stored. cert-manager will generate and store the private key here if it does not already exist.",
          "required": ["name"],
          "properties": {
            "name": {
              "type": "string",
              "description": "Name of the Secret containing the ACME account private key."
            },
            "key": {
              "type": "string",
              "description": "Key within the Secret containing the private key. Defaults to 'tls.key'."
            }
          }
        },
        "skipTLSVerify": {
          "type": "boolean",
          "description": "Whether to disable TLS certificate verification when communicating with the ACME server. Only use for development/testing with self-signed ACME servers.",
          "default": false
        },
        "preferredChain": {
          "type": "string",
          "description": "Name of the preferred certificate chain to use when multiple chains are offered by the CA. For example, 'ISRG Root X1' for Let's Encrypt."
        },
        "caBundle": {
          "type": "string",
          "format": "byte",
          "description": "Base64-encoded PEM bundle of CA certificates to trust when verifying the ACME server's TLS certificate. Used with private ACME servers."
        },
        "solvers": {
          "type": "array",
          "description": "List of challenge solver configurations used by the ACME issuer for domain ownership verification. At least one solver is required. Solvers are selected by matching selectors against the domains in a certificate request.",
          "items": {
            "$ref": "#/$defs/ACMEChallengeSolver"
          }
        },
        "disableAccountKeyGeneration": {
          "type": "boolean",
          "description": "Whether to disable automatic generation of the ACME account private key. If true, the key must already exist in the Secret referenced by privateKeySecretRef.",
          "default": false
        },
        "enableDurationFeature": {
          "type": "boolean",
          "description": "Whether to request a specific certificate duration from the ACME server using the ACME renewalInfo (ARI) extension. Only supported by some ACME servers."
        }
      }
    },
    "ACMEChallengeSolver": {
      "type": "object",
      "description": "A challenge solver configuration specifying how to complete ACME challenges for matching domains. A solver may use HTTP-01 or DNS-01 challenge types.",
      "properties": {
        "selector": {
          "type": "object",
          "description": "Optional selector restricting which Certificate requests and domains this solver applies to. If omitted, this solver is used as a fallback.",
          "properties": {
            "dnsNames": {
              "type": "array",
              "description": "DNS names that this solver handles. Takes priority over dnsZones when both match.",
              "items": {
                "type": "string",
                "description": "An exact DNS name this solver handles."
              }
            },
            "dnsZones": {
              "type": "array",
              "description": "DNS zones that this solver handles. A solver is selected if the domain is a subdomain of any listed zone.",
              "items": {
                "type": "string",
                "description": "A DNS zone (e.g., example.com)."
              }
            },
            "matchLabels": {
              "type": "object",
              "description": "Label selector matching Certificate resources this solver should be used for.",
              "additionalProperties": {
                "type": "string"
              }
            }
          }
        },
        "http01": {
          "type": "object",
          "description": "HTTP-01 challenge solver configuration. cert-manager creates temporary Ingress or Gateway API resources to serve the challenge response over HTTP.",
          "properties": {
            "ingress": {
              "type": "object",
              "description": "Ingress-based HTTP-01 challenge solver.",
              "properties": {
                "class": {
                  "type": "string",
                  "description": "Ingress class annotation value for the temporary challenge Ingress. Deprecated; use ingressClassName instead."
                },
                "ingressClassName": {
                  "type": "string",
                  "description": "IngressClass name for the challenge Ingress resource."
                },
                "name": {
                  "type": "string",
                  "description": "Name of an existing Ingress resource to append challenge rules to."
                },
                "serviceType": {
                  "type": "string",
                  "description": "Kubernetes Service type for the HTTP-01 challenge server. Defaults to NodePort.",
                  "enum": ["ClusterIP", "NodePort"]
                }
              }
            },
            "gatewayHTTPRoute": {
              "type": "object",
              "description": "Gateway API-based HTTP-01 challenge solver using HTTPRoute resources.",
              "properties": {
                "parentRefs": {
                  "type": "array",
                  "description": "Gateway parent references for the challenge HTTPRoute.",
                  "items": {
                    "type": "object",
                    "description": "A Gateway parent reference."
                  }
                },
                "labels": {
                  "type": "object",
                  "description": "Labels to add to the challenge HTTPRoute.",
                  "additionalProperties": {
                    "type": "string"
                  }
                }
              }
            },
            "podTemplate": {
              "type": "object",
              "description": "Optional template for the Pod created to serve the HTTP-01 challenge response."
            }
          }
        },
        "dns01": {
          "type": "object",
          "description": "DNS-01 challenge solver configuration. cert-manager creates temporary DNS TXT records to prove domain ownership.",
          "properties": {
            "cnameStrategy": {
              "type": "string",
              "description": "Strategy for following CNAME records when resolving DNS for challenges.",
              "enum": ["None", "Follow"],
              "default": "None"
            },
            "acmeDNS": {
              "type": "object",
              "description": "acme-dns server configuration for DNS-01 challenges."
            },
            "akamai": {
              "type": "object",
              "description": "Akamai FastDNS configuration for DNS-01 challenges."
            },
            "azureDNS": {
              "type": "object",
              "description": "Azure DNS configuration for DNS-01 challenges."
            },
            "cloudDNS": {
              "type": "object",
              "description": "Google Cloud DNS configuration for DNS-01 challenges."
            },
            "cloudflare": {
              "type": "object",
              "description": "Cloudflare DNS configuration for DNS-01 challenges."
            },
            "digitalocean": {
              "type": "object",
              "description": "DigitalOcean DNS configuration for DNS-01 challenges."
            },
            "rfc2136": {
              "type": "object",
              "description": "RFC 2136 (Dynamic DNS Update) configuration for DNS-01 challenges."
            },
            "route53": {
              "type": "object",
              "description": "AWS Route53 DNS configuration for DNS-01 challenges."
            },
            "webhook": {
              "type": "object",
              "description": "External webhook DNS provider configuration for DNS-01 challenges."
            }
          }
        }
      }
    },
    "CAIssuer": {
      "type": "object",
      "description": "Configuration for a CA issuer that signs certificates using a CA certificate stored in a Kubernetes Secret. The CA certificate and private key must already exist in the cluster.",
      "required": ["secretName"],
      "properties": {
        "secretName": {
          "type": "string",
          "description": "Name of the Secret containing the CA certificate (tls.crt) and CA private key (tls.key) in the same namespace as the Issuer, or in the cert-manager namespace for ClusterIssuer.",
          "minLength": 1
        },
        "crlDistributionPoints": {
          "type": "array",
          "description": "Optional list of CRL Distribution Point URLs to embed in issued certificates.",
          "items": {
            "type": "string",
            "format": "uri",
            "description": "A CRL distribution point URL."
          }
        },
        "ocspServers": {
          "type": "array",
          "description": "Optional list of OCSP server URLs to embed in issued certificates.",
          "items": {
            "type": "string",
            "format": "uri",
            "description": "An OCSP server URL."
          }
        },
        "issuingCertificateURLs": {
          "type": "array",
          "description": "Optional list of Issuing Certificate URLs to embed in issued certificates (AIA extension).",
          "items": {
            "type": "string",
            "format": "uri",
            "description": "An issuing certificate URL."
          }
        }
      }
    },
    "SelfSignedIssuer": {
      "type": "object",
      "description": "Configuration for a SelfSigned issuer that signs certificates with their own private key. Useful for bootstrapping PKI hierarchies or generating self-signed CA certificates. No configuration is required.",
      "properties": {
        "crlDistributionPoints": {
          "type": "array",
          "description": "Optional list of CRL Distribution Point URLs to embed in issued self-signed certificates.",
          "items": {
            "type": "string",
            "format": "uri",
            "description": "A CRL distribution point URL."
          }
        }
      }
    },
    "VaultIssuer": {
      "type": "object",
      "description": "Configuration for a HashiCorp Vault issuer that signs certificates using Vault's PKI Secrets Engine.",
      "required": ["server", "path", "auth"],
      "properties": {
        "server": {
          "type": "string",
          "format": "uri",
          "description": "URL of the HashiCorp Vault server (e.g., https://vault.example.com)."
        },
        "path": {
          "type": "string",
          "description": "Vault PKI path for signing certificates (e.g., pki/sign/my-role or pki_int/sign/my-role).",
          "minLength": 1
        },
        "namespace": {
          "type": "string",
          "description": "Vault namespace for Vault Enterprise clusters."
        },
        "caBundle": {
          "type": "string",
          "format": "byte",
          "description": "Base64-encoded PEM CA bundle for verifying the Vault server's TLS certificate."
        },
        "auth": {
          "type": "object",
          "description": "Vault authentication configuration. Exactly one authentication method must be specified.",
          "properties": {
            "tokenSecretRef": {
              "type": "object",
              "description": "Vault token authentication using a token stored in a Kubernetes Secret.",
              "required": ["name"],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the Secret containing the Vault token."
                },
                "key": {
                  "type": "string",
                  "description": "Key within the Secret containing the Vault token. Defaults to 'token'."
                }
              }
            },
            "appRole": {
              "type": "object",
              "description": "Vault AppRole authentication using a role ID and secret ID.",
              "required": ["path", "roleId", "secretRef"],
              "properties": {
                "path": {
                  "type": "string",
                  "description": "AppRole auth mount path (e.g., approle)."
                },
                "roleId": {
                  "type": "string",
                  "description": "The AppRole role ID."
                },
                "secretRef": {
                  "type": "object",
                  "description": "Reference to a Secret containing the AppRole secret ID.",
                  "required": ["name"],
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the Secret."
                    },
                    "key": {
                      "type": "string",
                      "description": "Key within the Secret. Defaults to 'secretId'."
                    }
                  }
                }
              }
            },
            "kubernetes": {
              "type": "object",
              "description": "Vault Kubernetes auth using a Kubernetes ServiceAccount token.",
              "required": ["role"],
              "properties": {
                "role": {
                  "type": "string",
                  "description": "Vault Kubernetes auth role name."
                },
                "mountPath": {
                  "type": "string",
                  "description": "Kubernetes auth mount path. Defaults to /v1/auth/kubernetes.",
                  "default": "/v1/auth/kubernetes"
                },
                "serviceAccountRef": {
                  "type": "object",
                  "description": "Optional reference to a specific ServiceAccount to use for authentication.",
                  "required": ["name"],
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "ServiceAccount name."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "VenafiIssuer": {
      "type": "object",
      "description": "Configuration for a Venafi (CyberArk) issuer that signs certificates using Venafi Trust Protection Platform (TPP) or Venafi as a Service (VaaS/TLS Protect Cloud).",
      "required": ["zone"],
      "properties": {
        "zone": {
          "type": "string",
          "description": "Venafi policy zone path. For TPP, this is the policy folder path. For VaaS, this is the application name and issuing template.",
          "minLength": 1
        },
        "tpp": {
          "type": "object",
          "description": "Venafi Trust Protection Platform (TPP) connection configuration.",
          "required": ["url", "credentialsRef"],
          "properties": {
            "url": {
              "type": "string",
              "format": "uri",
              "description": "Base URL of the Venafi TPP server (e.g., https://tpp.example.com/vedsdk)."
            },
            "caBundle": {
              "type": "string",
              "format": "byte",
              "description": "Base64-encoded PEM CA bundle for verifying the TPP server TLS certificate."
            },
            "credentialsRef": {
              "type": "object",
              "description": "Reference to a Secret containing TPP username and password.",
              "required": ["name"],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the Secret containing the TPP credentials."
                }
              }
            }
          }
        },
        "cloud": {
          "type": "object",
          "description": "Venafi as a Service (TLS Protect Cloud) connection configuration.",
          "required": ["apiTokenSecretRef"],
          "properties": {
            "url": {
              "type": "string",
              "format": "uri",
              "description": "URL of the Venafi Cloud API. Defaults to https://api.venafi.cloud.",
              "default": "https://api.venafi.cloud"
            },
            "apiTokenSecretRef": {
              "type": "object",
              "description": "Reference to a Secret containing the Venafi Cloud API token.",
              "required": ["name"],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the Secret containing the Venafi Cloud API token."
                },
                "key": {
                  "type": "string",
                  "description": "Key within the Secret. Defaults to 'api-key'."
                }
              }
            }
          }
        }
      }
    },
    "IssuerStatus": {
      "type": "object",
      "description": "Observed state of the Issuer or ClusterIssuer as maintained by the cert-manager controller.",
      "properties": {
        "conditions": {
          "type": "array",
          "description": "List of status conditions. The Ready condition indicates whether the issuer is ready to sign certificates.",
          "items": {
            "$ref": "#/$defs/IssuerCondition"
          }
        },
        "acme": {
          "type": "object",
          "description": "ACME-specific status including the registered account URI.",
          "properties": {
            "uri": {
              "type": "string",
              "format": "uri",
              "description": "URL of the registered ACME account."
            },
            "lastRegisteredEmail": {
              "type": "string",
              "format": "email",
              "description": "Last email address used for the ACME account registration."
            },
            "lastPrivateKeyHash": {
              "type": "string",
              "description": "Hash of the ACME account private key for detecting key changes."
            }
          }
        }
      }
    },
    "IssuerCondition": {
      "type": "object",
      "description": "A status condition on an Issuer or ClusterIssuer resource.",
      "required": ["type", "status"],
      "properties": {
        "type": {
          "type": "string",
          "description": "The condition type. Ready indicates the issuer is ready to sign certificates.",
          "enum": ["Ready"]
        },
        "status": {
          "type": "string",
          "description": "The condition status.",
          "enum": ["True", "False", "Unknown"]
        },
        "reason": {
          "type": "string",
          "description": "Machine-readable reason code for the condition."
        },
        "message": {
          "type": "string",
          "description": "Human-readable message providing context for the condition status."
        },
        "lastTransitionTime": {
          "type": "string",
          "format": "date-time",
          "description": "Time at which the condition last transitioned."
        },
        "observedGeneration": {
          "type": "integer",
          "description": "Spec generation this condition was computed from.",
          "minimum": 0
        }
      }
    }
  }
}