kadet-hub logokadet-hub

certmanager

Renders cert-manager Certificates, Issuers, ClusterIssuers and trust-manager Bundles from inventory parameters.

kubernetesoperatorssecurity

Latest
1.0.2 ·
License
Apache-2.0
Owners
Moep90
Source
github.com/kadet-hub/generators · 0 repo stars, shared by 35 generators
Thumbs up
👍 0 on GitHub Discussions
Popularity
18 · 532 pulls

Request a feature Report a problem

Badge

Show the latest listed version in your README. shields.io draws the badge from this page's badge.json, which every catalog build updates; once no version is listed, it reads "not listed".

[![kadet-hub](https://img.shields.io/endpoint?url=https://kadet-hub.org/generators/certmanager/badge.json)](https://kadet-hub.org/generators/certmanager/)

cert-manager Generator

Published on kadet-hub: pin a released version by digest from its catalog page.

Kapitan kadet generator for cert-manager and trust-manager resources. Built for cert-manager 1.21.2 (cert-manager.io/v1) and trust-manager 0.25.0 (trust.cert-manager.io/v1alpha1):

  • Certificate: requests a certificate from an Issuer or ClusterIssuer and stores it in a Secret
  • Issuer: namespaced certificate authority (ACME, CA, self-signed, Vault, …)
  • ClusterIssuer: cluster-scoped certificate authority
  • Bundle: trust-manager CA bundle synced into ConfigMaps or Secrets across namespaces

Short entries expand to the settings cert-manager and Let’s Encrypt recommend: Certificates rotate their private key, Let’s Encrypt issuers get the right directory URL, their own account key and an HTTP01 solver bound to one ingress class, and one ca_issuers entry bootstraps a private CA. The CA key Secrets and solver credentials belong in the kubernetes or external-secrets generator.

Usage

Kapitan Configuration

parameters:
  kapitan:
    dependencies:
      - type: oci
        source: ghcr.io/kadet-hub/certmanager@sha256:<digest>
        output_path: lib/certmanager
    compile:
      - output_path: manifests/cert-manager/
        input_type: kadet
        output_type: yml
        input_paths:
          - lib/certmanager

Inventory Contract

All keys live under parameters.generators.certmanager. Without that block the generator renders nothing.

Key Kind Output key
namespace Default namespace for Certificates and Issuers. Falls back to parameters.namespace, then default.
certs.<name> Certificate <namespace>/<name>-cert
issuers.<name> Issuer <namespace>/<name>-issuer
clusterissuers.<name> ClusterIssuer <name>-cissuer
bundles.<name> Bundle <name>-bundle
ca_issuers.<name> ClusterIssuer, Certificate, ClusterIssuer <name>-selfsigned-cissuer, <namespace>/<name>-cert, <name>-cissuer

Every entry accepts these keys:

Key Description
spec The resource spec, passed through. Required for Certificates and Bundles; Issuers and ClusterIssuers need spec or letsencrypt.
name Overrides the map key in metadata.name and in the output key.
namespace Certificate, Issuer and ca_issuers only. ClusterIssuer and Bundle are cluster-scoped; a Bundle selects its target namespaces in spec.target.namespaceSelector.
type Entries without type or with type: certmanager render; any other value skips the entry, for resources managed elsewhere.

Defaults and shorthands

Precedence is generator defaults, then spec (certificate for ca_issuers), then shorthands: a shorthand wins over the same field in spec and logs a warning, and both win over the defaults; maps merge, lists and values replace.

Applies to Input Output Source
Certificate always privateKey.rotationPolicy: Always Rotation of the private key: recommended on every Certificate. The controller default since 1.18 sits behind a feature gate (1.18 release notes), so the generator sets it explicitly.
Issuer, ClusterIssuer letsencrypt: production or staging acme.server: https://acme-v02.api.letsencrypt.org/directory or https://acme-staging-v02.api.letsencrypt.org/directory Let’s Encrypt ACME endpoints, staging environment
Issuer, ClusterIssuer email: <address> acme.email ACME issuer
Issuer, ClusterIssuer http01_ingress_class: <class> acme.solvers: [{http01: {ingress: {ingressClassName: <class>}}}] HTTP01 ingressClassName: the recommended field; without a class every ingress controller serves the challenge.
Issuer, ClusterIssuer with acme no privateKeySecretRef acme.privateKeySecretRef.name: <name>-account-key Any name works (ACME issuer); one Secret per issuer keeps staging and production apart, since Let’s Encrypt accounts are scoped per environment (staging environment).

A ca_issuers.<name> entry renders the SelfSigned bootstrap of a CA issuer:

  • ClusterIssuer <name>-selfsigned with selfSigned: {}.
  • Certificate <name> with isCA: true, commonName from common_name (default <name>), secretName: <name>, an ECDSA P-256 key and issuerRef to <name>-selfsigned. certificate overrides fields of this spec, for example duration, subject or privateKey.size.
  • ClusterIssuer <name> with ca.secretName set to the Certificate’s secretName. Certificates reference this one.

The Certificate goes to namespace, default cert-manager: a ClusterIssuer reads its Secret from the controller’s cluster resource namespace, so set namespace only when --cluster-resource-namespace differs. The root renews on cert-manager’s schedule with a new key; distribute trust from a copy of the root in a separate ConfigMap, as trust-manager recommends, not from the CA Secret.

Controller defaults are not emitted: duration 90 days, renewal at two thirds of the lifetime, revisionHistoryLimit: 1, the default key usages and an RSA 2048 key for leaf certificates (Certificate resource).

The compile fails with ValueError: certmanager ... when an entry lacks spec (or letsencrypt for issuers), letsencrypt is neither production nor staging, or a ca_issuers resource has the same output key as another entry.

Example

parameters:
  namespace: apps
  generators:
    certmanager:
      ca_issuers:
        internal-ca:
          common_name: Internal Root CA
      clusterissuers:
        letsencrypt-staging:
          letsencrypt: staging
          email: platform-team@example.com
          http01_ingress_class: nginx
        letsencrypt-prod:
          letsencrypt: production
          email: platform-team@example.com
          http01_ingress_class: nginx
      certs:
        api-tls:
          spec:
            secretName: api-tls
            issuerRef:
              name: letsencrypt-prod
              kind: ClusterIssuer
            dnsNames:
              - api.example.com
        orders-db-tls:
          spec:
            secretName: orders-db-tls
            issuerRef:
              name: internal-ca
              kind: ClusterIssuer
            dnsNames:
              - orders-db.apps.svc
      bundles:
        internal-ca-bundle:
          spec:
            sources:
              - useDefaultCAs: true
              - configMap:
                  name: internal-ca-root
                  key: ca.crt
            target:
              configMap:
                key: ca-bundle.crt
              namespaceSelector:
                matchLabels:
                  trust-internal-ca: "true"

This renders internal-ca-selfsigned-cissuer, cert-manager/internal-ca-cert, internal-ca-cissuer, letsencrypt-staging-cissuer, letsencrypt-prod-cissuer, apps/api-tls-cert, apps/orders-db-tls-cert and internal-ca-bundle-bundle. The internal-ca-root ConfigMap holds the copied root.

Versions

Add a version's inventory entry, then compile with the consumer workflow, which verifies the artifact and runs Kapitan in the sandbox.

Free of charge, as is and on a best-effort basis: use at your own risk, and review the compiled output before you apply it. Terms

This catalog was built from index serial 47. Set index_serial: 47 in .kapitan-sandbox.yaml and the consumer workflow refuses any older index, so a rolled-back index cannot bring back a yanked version.

Checks find known patterns; they do not prove a generator safe. What a listing covers

VersionBuilt for (schema-checked)
1.0.2cert-manager 1.21.2
trust-manager 0.25.0
1.0.1cert-manager 1.21.2
trust-manager 0.25.0
1.0.0cert-manager 1.21.2
trust-manager 0.25.0
1.0.2

Inventory

parameters:
  kapitan:
    dependencies:
      - type: oci
        source: ghcr.io/kadet-hub/certmanager:1.0.2@sha256:ba7632e9e06a593fbe20e9fa6774139203d7df65992adff9db94779606888ad9
        output_path: lib/certmanager

Verify

gh attestation verify \
  oci://ghcr.io/kadet-hub/certmanager@sha256:ba7632e9e06a593fbe20e9fa6774139203d7df65992adff9db94779606888ad9 \
  --owner kadet-hub \
  --cert-identity https://github.com/kadet-hub/registry/.github/workflows/release.yml@refs/heads/main

Transparency log: Rekor entry 3249980629, in Sigstore's public, append-only log, so the attestation stays checkable independent of this site.

Kapitan declared
>=0.36.3,<0.37
Kapitan checked
0.36.3
Backends checked
not recorded
With --cache
not recorded
krab
compatible
Built for (schema-checked)
cert-manager 1.21.2
trust-manager 0.25.0
Source
certmanager-v1.0.2 · e4891e8fd85ca0a19ebf361e8b54fd6473fd8a2f · certmanager
Binaries
none
Output capabilities
none
Digest
sha256:ba7632e9e06a593fbe20e9fa6774139203d7df65992adff9db94779606888ad9

Checks

Checked by the release run on , gate at 6f0242aa6a3c.

  • Secrets gitleaks 8.30.1
    No secret matched the marketplace's gitleaks rules.
  • Malware ClamAV 1.5.4
    No file matched a ClamAV signature.
  • Malicious package heuristics GuardDog 3.2.0
    No GuardDog threat rule matched.
  • Dangerous code Semgrep 1.180.0
    No marketplace Semgrep rule matched, such as eval, subprocess or network calls.
  • Python errors Ruff 0.17.0
    No syntax error or undefined name (Ruff, error rules only).
  • File tree tree_check.py
    No symlink, executable or banned file; imports within the allowlist.
  • Sandboxed compile gVisor 20261005, Kapitan 0.36.3
    The fixture compiled without network, with decoy credentials; no undeclared program ran, no decoy was read.
  • Output capabilities Conftest 0.71.1
    The compiled output uses only the capabilities the manifest declares.
  • CI detection Kapitan 0.36.3
    The output is the same with CI variables set.

SBOM (SPDX 2.3)

Output diff

No output diff recorded: this version was published before the release run recorded one.

1.0.1

Inventory

parameters:
  kapitan:
    dependencies:
      - type: oci
        source: ghcr.io/kadet-hub/certmanager:1.0.1@sha256:ee081b9155fbeb038e56c0a438f539c21df06b3a9a5e882500390abe1179a623
        output_path: lib/certmanager

Verify

gh attestation verify \
  oci://ghcr.io/kadet-hub/certmanager@sha256:ee081b9155fbeb038e56c0a438f539c21df06b3a9a5e882500390abe1179a623 \
  --owner kadet-hub \
  --cert-identity https://github.com/kadet-hub/registry/.github/workflows/release.yml@refs/heads/main

Transparency log: Rekor entry 3244063021, in Sigstore's public, append-only log, so the attestation stays checkable independent of this site.

Kapitan declared
>=0.36.3,<0.37
Kapitan checked
0.36.3
Backends checked
not recorded
With --cache
not recorded
krab
compatible
Built for (schema-checked)
cert-manager 1.21.2
trust-manager 0.25.0
Source
certmanager-v1.0.1 · 9166cb30e0ae4874bc8f229c6a6823eff7451d04 · certmanager
Binaries
none
Output capabilities
none
Digest
sha256:ee081b9155fbeb038e56c0a438f539c21df06b3a9a5e882500390abe1179a623

Checks

Checked by the release run on , gate at cc653998a763.

  • Secrets gitleaks 8.30.1
    No secret matched the marketplace's gitleaks rules.
  • Malware ClamAV 1.5.4
    No file matched a ClamAV signature.
  • Malicious package heuristics GuardDog 3.2.0
    No GuardDog threat rule matched.
  • Dangerous code Semgrep 1.180.0
    No marketplace Semgrep rule matched, such as eval, subprocess or network calls.
  • Python errors Ruff 0.17.0
    No syntax error or undefined name (Ruff, error rules only).
  • File tree tree_check.py
    No symlink, executable or banned file; imports within the allowlist.
  • Sandboxed compile gVisor 20261005, Kapitan 0.36.3
    The fixture compiled without network, with decoy credentials; no undeclared program ran, no decoy was read.
  • Output capabilities Conftest 0.71.1
    The compiled output uses only the capabilities the manifest declares.
  • CI detection Kapitan 0.36.3
    The output is the same with CI variables set.

SBOM (SPDX 2.3)

Output diff

No output diff recorded: this version was published before the release run recorded one.

1.0.0

Inventory

parameters:
  kapitan:
    dependencies:
      - type: oci
        source: ghcr.io/kadet-hub/certmanager:1.0.0@sha256:380f4d9477cff958a194deecb0c049974e56e9c43371e152dcb23f154799f99d
        output_path: lib/certmanager

Verify

gh attestation verify \
  oci://ghcr.io/kadet-hub/certmanager@sha256:380f4d9477cff958a194deecb0c049974e56e9c43371e152dcb23f154799f99d \
  --owner kadet-hub \
  --cert-identity https://github.com/kadet-hub/registry/.github/workflows/release.yml@refs/heads/main

Transparency log: Rekor entry 3210093542, in Sigstore's public, append-only log, so the attestation stays checkable independent of this site.

Kapitan declared
>=0.36.3,<0.37
Kapitan checked
0.36.3
Backends checked
not recorded
With --cache
not recorded
krab
compatible
Built for (schema-checked)
cert-manager 1.21.2
trust-manager 0.25.0
Source
certmanager-v1.0.0 · cd660d06c2e97a2bc842f0e75475f639a82f128d · certmanager
Binaries
none
Output capabilities
none
Digest
sha256:380f4d9477cff958a194deecb0c049974e56e9c43371e152dcb23f154799f99d

Checks

Checked by the release run on , gate at a6abb26ac69c.

  • Secrets gitleaks 8.30.1
    No secret matched the marketplace's gitleaks rules.
  • Malware ClamAV 1.5.4
    No file matched a ClamAV signature.
  • Malicious package heuristics GuardDog 3.2.0
    No GuardDog threat rule matched.
  • Dangerous code Semgrep 1.180.0
    No marketplace Semgrep rule matched, such as eval, subprocess or network calls.
  • Python errors Ruff 0.17.0
    No syntax error or undefined name (Ruff, error rules only).
  • File tree tree_check.py
    No symlink, executable or banned file; imports within the allowlist.
  • Sandboxed compile gVisor 20261005, Kapitan 0.36.3
    The fixture compiled without network, with decoy credentials; no undeclared program ran, no decoy was read.
  • Output capabilities Conftest 0.71.1
    The compiled output uses only the capabilities the manifest declares.
  • CI detection Kapitan 0.36.3
    The output is the same with CI variables set.

SBOM (SPDX 2.3)

Output diff

No output diff recorded: this version was published before the release run recorded one.