Skip to content

feat(certificate-shim): implementing XListenerSet#8394

Merged
cert-manager-prow[bot] merged 3 commits intocert-manager:masterfrom
hjoshi123:feat/xlistenerset-implementation
Jan 29, 2026
Merged

feat(certificate-shim): implementing XListenerSet#8394
cert-manager-prow[bot] merged 3 commits intocert-manager:masterfrom
hjoshi123:feat/xlistenerset-implementation

Conversation

@hjoshi123
Copy link
Copy Markdown
Collaborator

@hjoshi123 hjoshi123 commented Jan 10, 2026

Pull Request Motivation

This PR introduces support for XListenerSet and allows the self-service model of TLS in ingress to be brought to Gateways. On a high level it uses this design https://github.com/cert-manager/cert-manager/blob/3a268f0720e1d34a495e7e73ba6ebfada8e8cb14/design/20250703.gatewayapi-listenerset.md.
Fixes #8252

/kind feature

Release Note

added experimental `XListenerSet` feature gate

Test it yourself

You can try out the certificate-shim support for XListenerSet using v1.20.0-alpha.1:

helm upgrade --install cert-manager oci://quay.io/jetstack/charts/cert-manager \
  --version v1.20.0-alpha.1 \
  --namespace cert-manager \
  --set config.apiVersion="controller.config.cert-manager.io/v1alpha1" \
  --set config.kind="ControllerConfiguration" \
  --set config.enableGatewayAPI=true \
  --set config.enableGatewayAPIXListenerSet=true

@cert-manager-prow cert-manager-prow bot added do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. release-note Denotes a PR that will be considered when it comes time to generate release notes. kind/feature Categorizes issue or PR as related to a new feature. dco-signoff: yes Indicates that all commits in the pull request have the valid DCO sign-off message. area/deploy Indicates a PR modifies deployment configuration size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Jan 10, 2026
@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch from e44ddd1 to 8d0afca Compare January 10, 2026 18:14
@maelvls
Copy link
Copy Markdown
Member

maelvls commented Jan 13, 2026

I've asked Codex to review the PR. It left a couple of comments.

@hjoshi123
Copy link
Copy Markdown
Collaborator Author

/label tide/merge-method-squash

@cert-manager-prow cert-manager-prow bot added the tide/merge-method-squash Denotes a PR that should be squashed by tide when it merges. label Jan 14, 2026
@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch from c0512c3 to 63b0e75 Compare January 15, 2026 16:18
@cert-manager-prow cert-manager-prow bot added the area/api Indicates a PR directly modifies the 'pkg/apis' directory label Jan 15, 2026
@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch 4 times, most recently from a14f7d5 to 48b253b Compare January 17, 2026 05:56
@cert-manager-prow cert-manager-prow bot added area/testing Issues relating to testing size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Jan 17, 2026
@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch 4 times, most recently from 2af5b4d to 07d5caa Compare January 21, 2026 03:22
@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch 2 times, most recently from 436ed31 to 855d7ca Compare January 22, 2026 05:57
@thomaslochet
Copy link
Copy Markdown

there is a typo issue in cmd/controller/app/options/options.go at line 179: "enabeld".

@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch from 855d7ca to f3f045c Compare January 24, 2026 04:54
@hjoshi123 hjoshi123 changed the title WIP feat(certificate-shim): implementing XListenerSet feat(certificate-shim): implementing XListenerSet Jan 24, 2026
@cert-manager-prow cert-manager-prow bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jan 24, 2026
@erikgb erikgb requested a review from Copilot January 25, 2026 18:10
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR implements support for XListenerSet resources in cert-manager, enabling self-service TLS configuration for Gateway API users. XListenerSet is an experimental Gateway API feature that allows teams to manage their own listeners on a shared Gateway without requiring cluster-admin privileges.

Changes:

  • Added experimental XListenerSets feature gate (alpha in v1.20.1)
  • Implemented listenerset controller that watches XListenerSets and creates Certificate resources
  • Extended certificate-shim sync logic to handle XListenerSet resources alongside Ingress and Gateway resources
  • Added annotation inheritance from parent Gateway to XListenerSet for issuer configuration

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
internal/controller/feature/features.go Adds XListenerSets feature gate definition as an alpha feature
pkg/apis/config/controller/v1alpha1/types.go Adds EnableGatewayAPIXListenerSets configuration field
internal/apis/config/controller/types.go Adds internal EnableGatewayAPIXListenerSets configuration field
pkg/apis/config/controller/v1alpha1/zz_generated.deepcopy.go Generated deepcopy code for new configuration field
internal/apis/config/controller/v1alpha1/zz_generated.conversion.go Generated conversion code for new configuration field
pkg/controller/certificate-shim/listenerset/controller.go Implements the listenerset controller with parent Gateway indexing and annotation inheritance
pkg/controller/certificate-shim/listenerset/controller_test.go Unit tests for controller registration and event handling
pkg/controller/certificate-shim/sync.go Extends buildCertificates, validateIngressLike, and secretNameUsedIn to support XListenerSet
pkg/controller/certificate-shim/helper.go Adds translateXListenerToGWAPIV1Listener helper for validation
pkg/controller/context.go Adds validation to ensure experimental Gateway API CRDs are installed when feature is enabled
cmd/controller/app/controller.go Wires EnableGatewayAPIXListenerSets config option into controller context
cmd/controller/app/options/options.go Adds --enable-gateway-api-xlistenersets command-line flag and enables controller conditionally
deploy/charts/cert-manager/templates/rbac.yaml Adds RBAC permissions for XListenerSet resources
test/e2e/util/util.go Adds NewListenerSet test helper function
test/e2e/suite/conformance/certificates/tests.go Adds E2E test for XListenerSet certificate creation with annotations
make/e2e.sh Enables XListenerSets feature gate in E2E tests
make/e2e-setup.mk Adds XListenerSets to feature gates and controller extraArgs for E2E setup

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch from f3f045c to 3838b85 Compare January 25, 2026 21:19
Signed-off-by: Hemant Joshi <mail@hjoshi.me>
Signed-off-by: hjoshi123 <mail@hjoshi.me>
Signed-off-by: Hemant Joshi <mail@hjoshi.me>
@hjoshi123 hjoshi123 force-pushed the feat/xlistenerset-implementation branch from 3838b85 to 881cd0d Compare January 25, 2026 21:28
@maelvls
Copy link
Copy Markdown
Member

maelvls commented Jan 29, 2026

I was able to manually test the PR using kgateway. I haven't tested the ACME integration with XListenerSet yet, though.

I found that it is not possible to have 0 listener on the Gateway resource as discussed in kubernetes-sigs/gateway-api#4425, so I had to keep a dummy listener.

I spent hours figuring out why I was getting "connection refused" from Envoy: turns out the HTTPRoute's conditions were telling me that the service wasn't found... which wasn't obvious as no error was showing with kubectl get httproute. I've hit lots of weird UX problems related to conditions and what's shown by kubectl get... I've compiled a list in https://hackmd.io/@maelvls/kgateway-rough-edges.

Also, I had to upgrade kgateway to v2.2.0-rc2 as v2.1.2 doesn't have arm64 images as detailed in #8426.

Details
make make kind-cluster e2e-setup-gatewayapi e2e-setup-gwapi-provider e2e-setup-certmanager e2e-setup-bind

Then, apply this:

kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: example-gw
  namespace: kgateway-system
  labels:
    app: example
spec:
  gatewayClassName: kgateway
  infrastructure:
    parametersRef:
      name: custom-gw-params
      kind: GatewayParameters
      group: gateway.kgateway.dev
  allowedListeners:
    namespaces:
      from: All
  listeners:
    - name: dummy
      hostname: dummy.example.com
      protocol: HTTP
      port: 12345
---
kind: XListenerSet
apiVersion: gateway.networking.x-k8s.io/v1alpha1
metadata:
  name: example-xls
  labels:
    app: example
  annotations:
    cert-manager.io/cluster-issuer: caissuer
spec:
  parentRef:
    name: example-gw
    namespace: kgateway-system
  listeners:
    - hostname: whoami.gateway.http01.example.com
      name: https
      protocol: HTTPS
      port: 443
      tls:
        mode: Terminate
        certificateRefs:
          - name: example
      allowedRoutes:
        namespaces:
          from: All
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: example-route
  labels:
    app: example
spec:
  parentRefs:
    - name: example-xls
      kind: XListenerSet
      group: gateway.networking.x-k8s.io
  hostnames:
    - whoami.gateway.http01.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: example
          port: 80
---
kind: Pod
apiVersion: v1
metadata:
  name: example
  labels:
    app: example
spec:
  containers:
    - name: example
      image: traefik/whoami
      ports:
        - name: http
          containerPort: 80
      resources:
        limits:
          cpu: 100m
          memory: 64Mi
        requests:
          cpu: 100m
          memory: 64Mi
---
apiVersion: v1
kind: Service
metadata:
  name: example
  labels:
    app: example
spec:
  ports:
    - name: http
      protocol: TCP
      port: 80
  selector:
    app: example
---
kind: ClusterIssuer
apiVersion: cert-manager.io/v1
metadata:
  name: caissuer
  labels:
    app: example
spec:
  ca:
    secretName: ca-key-pair
---
kind: ClusterIssuer
apiVersion: cert-manager.io/v1
metadata:
  name: selfsigned-issuer
  labels:
    app: example
spec:
  selfSigned: {}
---
kind: Certificate
apiVersion: cert-manager.io/v1
metadata:
  name: ca-key-pair
  namespace: cert-manager
  labels:
    app: example
spec:
  isCA: true
  commonName: my-ca
  secretName: ca-key-pair
  issuerRef:
    name: selfsigned-issuer
    kind: ClusterIssuer

It worked:

$ k get -A -l app=example all,gateway-api,cert-manager                            
NAMESPACE   NAME          READY   STATUS    RESTARTS   AGE
default     pod/example   1/1     Running   0          25m

NAMESPACE   NAME              TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
default     service/example   ClusterIP   10.0.252.22   <none>        80/TCP    25m

NAMESPACE         NAME                                           CLASS      ADDRESS   PROGRAMMED   AGE
kgateway-system   gateway.gateway.networking.k8s.io/example-gw   kgateway             True         3m34s

NAMESPACE   NAME                                                HOSTNAMES                               AGE
default     httproute.gateway.networking.k8s.io/example-route   ["whoami.gateway.http01.example.com"]   3m34s

NAMESPACE   NAME                                                  ACCEPTED   PROGRAMMED   AGE
default     xlistenerset.gateway.networking.x-k8s.io/example-ls   True       True         3m34s

NAMESPACE      NAME                                      READY   SECRET        AGE
cert-manager   certificate.cert-manager.io/ca-key-pair   True    ca-key-pair   25m

NAMESPACE   NAME                                              READY   AGE
            clusterissuer.cert-manager.io/caissuer            True    25m
            clusterissuer.cert-manager.io/selfsigned-issuer   True    25m

and run:

$ k run dummy -it --rm --restart=Never -q --image=nicolaka/netshoot -- curl -sS --fail-with-body -k https://whoami.gateway.http01.example.com
Hostname: example
IP: 127.0.0.1
IP: ::1
IP: 10.244.0.27
IP: fe80::b808:81ff:fe6b:5ec3
RemoteAddr: 10.244.0.28:54646
GET / HTTP/1.1
Host: whoami.gateway.http01.example.com
User-Agent: curl/8.18.0
Accept: */*
X-Envoy-Expected-Rq-Timeout-Ms: 15000
X-Envoy-External-Address: 10.244.0.29
X-Forwarded-For: 10.244.0.29
X-Forwarded-Proto: https
X-Request-Id: abd94ebe-38f3-40b0-9b18-e36c222796bd

@maelvls
Copy link
Copy Markdown
Member

maelvls commented Jan 29, 2026

/lgtm
/approve

@cert-manager-prow cert-manager-prow bot added the lgtm Indicates that a PR is ready to be merged. label Jan 29, 2026
@cert-manager-prow
Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: maelvls

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@cert-manager-prow cert-manager-prow bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jan 29, 2026
@cert-manager-prow cert-manager-prow bot merged commit 21a5e16 into cert-manager:master Jan 29, 2026
6 checks passed
@maelvls maelvls mentioned this pull request Feb 17, 2026
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Mar 10, 2026
…#4581)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [cert-manager/cert-manager](https://github.com/cert-manager/cert-manager) | minor | `v1.19.4` → `v1.20.0` |

---

### Release Notes

<details>
<summary>cert-manager/cert-manager (cert-manager/cert-manager)</summary>

### [`v1.20.0`](https://github.com/cert-manager/cert-manager/releases/tag/v1.20.0)

[Compare Source](cert-manager/cert-manager@v1.19.4...v1.20.0)

cert-manager is the easiest way to automatically manage certificates in Kubernetes and OpenShift clusters.

v1.20.0 adds support for the new ListenerSet resource, adds support for Azure Private DNS; parentRefs are no longer required when using ACME with Gateway API, and OtherNames was promoted to Beta.

#### Changes by Kind

##### Feature

- Added a set of flags to permit setting NetworkPolicy across all deployed containers. Remove redundant global IP ranges from example policies. ([#&#8203;8370](cert-manager/cert-manager#8370), [@&#8203;jcpunk](https://github.com/jcpunk))
- Added selectable fields to custom resource definitions for .spec.issuerRef.{group, kind, name} ([#&#8203;8256](cert-manager/cert-manager#8256), [@&#8203;tareksha](https://github.com/tareksha))
- Added support for specifying `imagePullSecrets` in the `startupapicheck-job` Helm template to enable pulling images from private registries. ([#&#8203;8186](cert-manager/cert-manager#8186), [@&#8203;mathieu-clnk](https://github.com/mathieu-clnk))
- Added 'extraContainers' helm chart value, allowing the deployment of arbitrary sidecar containers within the cert-manager operator pod. This can be used to support, for e.g., AWS IAM Roles Anywhere for Route53 DNS01 verification. ([#&#8203;8355](cert-manager/cert-manager#8355), [@&#8203;dancmeyers](https://github.com/dancmeyers))
- Added `parentRef` override annotations on the Certificate resource. ([#&#8203;8518](cert-manager/cert-manager#8518), [@&#8203;hjoshi123](https://github.com/hjoshi123))
- Added support for azure private zones for dns01 issuer. ([#&#8203;8494](cert-manager/cert-manager#8494), [@&#8203;hjoshi123](https://github.com/hjoshi123))
- Added support for configuring PEM decoding size limits, allowing operators to handle larger certificates and keys. ([#&#8203;7642](cert-manager/cert-manager#7642), [@&#8203;robertlestak](https://github.com/robertlestak))
- Added support for unhealthyPodEvictionPolicy in PodDisruptionBudget ([#&#8203;7728](cert-manager/cert-manager#7728), [@&#8203;jcpunk](https://github.com/jcpunk))
- For Venafi provider, read `venafi.cert-manager.io/custom-fields` annotation on Issuer/ClusterIssuer and use it as base with override/append capabilities on Certificate level. ([#&#8203;8301](cert-manager/cert-manager#8301), [@&#8203;k0da](https://github.com/k0da))
- Improve error message when CA issuers are misconfigured to use a clashing secret name ([#&#8203;8374](cert-manager/cert-manager#8374), [@&#8203;majiayu000](https://github.com/majiayu000))
- Introduce a new Ingress annotation `acme.cert-manager.io/http01-ingress-ingressclassname` to override `http01.ingress.ingressClassName` field in HTTP-01 challenge solvers. ([#&#8203;8244](cert-manager/cert-manager#8244), [@&#8203;lunarwhite](https://github.com/lunarwhite))
- Update `global.nodeSelector` to helm chart to perform a `merge` and allow for a single `nodeSelector` to be set across all services. ([#&#8203;8195](cert-manager/cert-manager#8195), [@&#8203;StingRayZA](https://github.com/StingRayZA))
- Vault issuers will now include the Vault server address as one of the default audiences on generated service account tokens. ([#&#8203;8228](cert-manager/cert-manager#8228), [@&#8203;terinjokes](https://github.com/terinjokes))
- Added experimental `XListenerSet` feature gate ([#&#8203;8394](cert-manager/cert-manager#8394), [@&#8203;hjoshi123](https://github.com/hjoshi123))

##### Documentation

- Add GWAPI documentation to NOTES.TXT in helm chart ([#&#8203;8353](cert-manager/cert-manager#8353), [@&#8203;jaxels10](https://github.com/jaxels10))

##### Bug or Regression

- Adds logs for cases when acme server returns us a fatal error in the order controller ([#&#8203;8199](cert-manager/cert-manager#8199), [@&#8203;Peac36](https://github.com/Peac36))
- Fixed an issue where kind or group in the issuerRef of a Certificate was omitted, upgrading to 1.19.x incorrectly caused the certificate to be renewed ([#&#8203;8160](cert-manager/cert-manager#8160), [@&#8203;inteon](https://github.com/inteon))
- Changes to the Duration and RenewBefore annotations on ingress and gateway-api resources will now trigger certificate updates. ([#&#8203;8232](cert-manager/cert-manager#8232), [@&#8203;eleanor-merry](https://github.com/eleanor-merry))
- Fix an issue where ACME challenge TXT records are not cleaned up when there are many resource records in CloudDNS. ([#&#8203;8456](cert-manager/cert-manager#8456), [@&#8203;tkna](https://github.com/tkna))
- Fix unregulated retries with the DigitalOcean DNS-01 solver
  Add full detailed DNS-01 errors to the events attached to the Challenge, for easier debugging ([#&#8203;8221](cert-manager/cert-manager#8221), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- Fixed an infinite re-issuance loop that could occur when an issuer returns a certificate with a public key that doesn't match the CSR. The issuing controller now validates the certificate before storing it and fails with backoff on mismatch. ([#&#8203;8403](cert-manager/cert-manager#8403), [@&#8203;calm329](https://github.com/calm329))
- Fixed an issue where HTTP-01 challenges failed when the Host header contains an IPv6 address. This means that users can now issue IP address certificates for IPv6 address subjects. ([#&#8203;8424](cert-manager/cert-manager#8424), [@&#8203;SlashNephy](https://github.com/SlashNephy))
- Fixed the HTTP-01 Gateway solver creating invalid HTTPRoutes by not setting spec.hostnames when the challenge DNSName is an IP address. ([#&#8203;8443](cert-manager/cert-manager#8443), [@&#8203;alviss7](https://github.com/alviss7))
- Revert API defaults for issuer reference kind and group introduced in 0.19.0 ([#&#8203;8173](cert-manager/cert-manager#8173), [@&#8203;erikgb](https://github.com/erikgb))
- Security (MODERATE): Fix a potential panic in the cert-manager controller when a DNS response in an unexpected order was cached. If an attacker was able to modify DNS responses (or if they controlled the DNS server) it was possible to cause denial of service for the cert-manager controller. ([#&#8203;8469](cert-manager/cert-manager#8469), [@&#8203;SgtCoDFish](https://github.com/SgtCoDFish))
- Update Go to `v1.25.5` to fix `CVE-2025-61727` and `CVE-2025-61729` ([#&#8203;8290](cert-manager/cert-manager#8290), [@&#8203;octo-sts](https://github.com/octo-sts)\[bot])
- When Prometheus monitoring is enabled, the metrics label is now set to the intended value of `cert-manager`. Previously, it was set depending on various factors (namespace cert-manager is installed in and/or Helm release name). ([#&#8203;8162](cert-manager/cert-manager#8162), [@&#8203;LiquidPL](https://github.com/LiquidPL))

##### Other (Cleanup or Flake)

- Promoted the OtherNames feature to Beta and enabled it by default ([#&#8203;8288](cert-manager/cert-manager#8288), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- Promoting `xlistenerset` feature gate to `listenerset` ([#&#8203;8501](cert-manager/cert-manager#8501), [@&#8203;hjoshi123](https://github.com/hjoshi123))
- Rebranding of the Venafi Issuer to CyberArk ([#&#8203;8215](cert-manager/cert-manager#8215), [@&#8203;iossifbenbassat123](https://github.com/iossifbenbassat123))
- Switched to SSA for challenge finalizer updates ([#&#8203;8519](cert-manager/cert-manager#8519), [@&#8203;inteon](https://github.com/inteon))
- The default container user (UID) is now 65532 (previously 1000) and the default container group (GID) is now 65532 (previously 0) ([#&#8203;8408](cert-manager/cert-manager#8408), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- The feature-gate DefaultPrivateKeyRotationPolicyAlways moved from Beta to GA and can no longer be disabled. ([#&#8203;8287](cert-manager/cert-manager#8287), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- Update cert-manager's ACME client, forked from golang/x/crypto ([#&#8203;8268](cert-manager/cert-manager#8268), [@&#8203;SgtCoDFish](https://github.com/SgtCoDFish))
- Use the latest version of Kyverno (1.16.2) in the best-practice installation tests ([#&#8203;8389](cert-manager/cert-manager#8389), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- We stopped testing with Coutour due to it not supporting the new XListenerSet resource, and moved to kgateway. ([#&#8203;8426](cert-manager/cert-manager#8426), [@&#8203;hjoshi123](https://github.com/hjoshi123))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4581
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Mar 10, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [cert-manager](https://cert-manager.io) ([source](https://github.com/cert-manager/cert-manager)) | minor | `v1.19.4` → `v1.20.0` |

---

### Release Notes

<details>
<summary>cert-manager/cert-manager (cert-manager)</summary>

### [`v1.20.0`](https://github.com/cert-manager/cert-manager/releases/tag/v1.20.0)

[Compare Source](cert-manager/cert-manager@v1.19.4...v1.20.0)

cert-manager is the easiest way to automatically manage certificates in Kubernetes and OpenShift clusters.

v1.20.0 adds support for the new ListenerSet resource, adds support for Azure Private DNS; parentRefs are no longer required when using ACME with Gateway API, and OtherNames was promoted to Beta.

#### Changes by Kind

##### Feature

- Added a set of flags to permit setting NetworkPolicy across all deployed containers. Remove redundant global IP ranges from example policies. ([#&#8203;8370](cert-manager/cert-manager#8370), [@&#8203;jcpunk](https://github.com/jcpunk))
- Added selectable fields to custom resource definitions for .spec.issuerRef.{group, kind, name} ([#&#8203;8256](cert-manager/cert-manager#8256), [@&#8203;tareksha](https://github.com/tareksha))
- Added support for specifying `imagePullSecrets` in the `startupapicheck-job` Helm template to enable pulling images from private registries. ([#&#8203;8186](cert-manager/cert-manager#8186), [@&#8203;mathieu-clnk](https://github.com/mathieu-clnk))
- Added 'extraContainers' helm chart value, allowing the deployment of arbitrary sidecar containers within the cert-manager operator pod. This can be used to support, for e.g., AWS IAM Roles Anywhere for Route53 DNS01 verification. ([#&#8203;8355](cert-manager/cert-manager#8355), [@&#8203;dancmeyers](https://github.com/dancmeyers))
- Added `parentRef` override annotations on the Certificate resource. ([#&#8203;8518](cert-manager/cert-manager#8518), [@&#8203;hjoshi123](https://github.com/hjoshi123))
- Added support for azure private zones for dns01 issuer. ([#&#8203;8494](cert-manager/cert-manager#8494), [@&#8203;hjoshi123](https://github.com/hjoshi123))
- Added support for configuring PEM decoding size limits, allowing operators to handle larger certificates and keys. ([#&#8203;7642](cert-manager/cert-manager#7642), [@&#8203;robertlestak](https://github.com/robertlestak))
- Added support for unhealthyPodEvictionPolicy in PodDisruptionBudget ([#&#8203;7728](cert-manager/cert-manager#7728), [@&#8203;jcpunk](https://github.com/jcpunk))
- For Venafi provider, read `venafi.cert-manager.io/custom-fields` annotation on Issuer/ClusterIssuer and use it as base with override/append capabilities on Certificate level. ([#&#8203;8301](cert-manager/cert-manager#8301), [@&#8203;k0da](https://github.com/k0da))
- Improve error message when CA issuers are misconfigured to use a clashing secret name ([#&#8203;8374](cert-manager/cert-manager#8374), [@&#8203;majiayu000](https://github.com/majiayu000))
- Introduce a new Ingress annotation `acme.cert-manager.io/http01-ingress-ingressclassname` to override `http01.ingress.ingressClassName` field in HTTP-01 challenge solvers. ([#&#8203;8244](cert-manager/cert-manager#8244), [@&#8203;lunarwhite](https://github.com/lunarwhite))
- Update `global.nodeSelector` to helm chart to perform a `merge` and allow for a single `nodeSelector` to be set across all services. ([#&#8203;8195](cert-manager/cert-manager#8195), [@&#8203;StingRayZA](https://github.com/StingRayZA))
- Vault issuers will now include the Vault server address as one of the default audiences on generated service account tokens. ([#&#8203;8228](cert-manager/cert-manager#8228), [@&#8203;terinjokes](https://github.com/terinjokes))
- Added experimental `XListenerSet` feature gate ([#&#8203;8394](cert-manager/cert-manager#8394), [@&#8203;hjoshi123](https://github.com/hjoshi123))

##### Documentation

- Add GWAPI documentation to NOTES.TXT in helm chart ([#&#8203;8353](cert-manager/cert-manager#8353), [@&#8203;jaxels10](https://github.com/jaxels10))

##### Bug or Regression

- Adds logs for cases when acme server returns us a fatal error in the order controller ([#&#8203;8199](cert-manager/cert-manager#8199), [@&#8203;Peac36](https://github.com/Peac36))
- Fixed an issue where kind or group in the issuerRef of a Certificate was omitted, upgrading to 1.19.x incorrectly caused the certificate to be renewed ([#&#8203;8160](cert-manager/cert-manager#8160), [@&#8203;inteon](https://github.com/inteon))
- Changes to the Duration and RenewBefore annotations on ingress and gateway-api resources will now trigger certificate updates. ([#&#8203;8232](cert-manager/cert-manager#8232), [@&#8203;eleanor-merry](https://github.com/eleanor-merry))
- Fix an issue where ACME challenge TXT records are not cleaned up when there are many resource records in CloudDNS. ([#&#8203;8456](cert-manager/cert-manager#8456), [@&#8203;tkna](https://github.com/tkna))
- Fix unregulated retries with the DigitalOcean DNS-01 solver
  Add full detailed DNS-01 errors to the events attached to the Challenge, for easier debugging ([#&#8203;8221](cert-manager/cert-manager#8221), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- Fixed an infinite re-issuance loop that could occur when an issuer returns a certificate with a public key that doesn't match the CSR. The issuing controller now validates the certificate before storing it and fails with backoff on mismatch. ([#&#8203;8403](cert-manager/cert-manager#8403), [@&#8203;calm329](https://github.com/calm329))
- Fixed an issue where HTTP-01 challenges failed when the Host header contains an IPv6 address. This means that users can now issue IP address certificates for IPv6 address subjects. ([#&#8203;8424](cert-manager/cert-manager#8424), [@&#8203;SlashNephy](https://github.com/SlashNephy))
- Fixed the HTTP-01 Gateway solver creating invalid HTTPRoutes by not setting spec.hostnames when the challenge DNSName is an IP address. ([#&#8203;8443](cert-manager/cert-manager#8443), [@&#8203;alviss7](https://github.com/alviss7))
- Revert API defaults for issuer reference kind and group introduced in 0.19.0 ([#&#8203;8173](cert-manager/cert-manager#8173), [@&#8203;erikgb](https://github.com/erikgb))
- Security (MODERATE): Fix a potential panic in the cert-manager controller when a DNS response in an unexpected order was cached. If an attacker was able to modify DNS responses (or if they controlled the DNS server) it was possible to cause denial of service for the cert-manager controller. ([#&#8203;8469](cert-manager/cert-manager#8469), [@&#8203;SgtCoDFish](https://github.com/SgtCoDFish))
- Update Go to `v1.25.5` to fix `CVE-2025-61727` and `CVE-2025-61729` ([#&#8203;8290](cert-manager/cert-manager#8290), [@&#8203;octo-sts](https://github.com/octo-sts)\[bot])
- When Prometheus monitoring is enabled, the metrics label is now set to the intended value of `cert-manager`. Previously, it was set depending on various factors (namespace cert-manager is installed in and/or Helm release name). ([#&#8203;8162](cert-manager/cert-manager#8162), [@&#8203;LiquidPL](https://github.com/LiquidPL))

##### Other (Cleanup or Flake)

- Promoted the OtherNames feature to Beta and enabled it by default ([#&#8203;8288](cert-manager/cert-manager#8288), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- Promoting `xlistenerset` feature gate to `listenerset` ([#&#8203;8501](cert-manager/cert-manager#8501), [@&#8203;hjoshi123](https://github.com/hjoshi123))
- Rebranding of the Venafi Issuer to CyberArk ([#&#8203;8215](cert-manager/cert-manager#8215), [@&#8203;iossifbenbassat123](https://github.com/iossifbenbassat123))
- Switched to SSA for challenge finalizer updates ([#&#8203;8519](cert-manager/cert-manager#8519), [@&#8203;inteon](https://github.com/inteon))
- The default container user (UID) is now 65532 (previously 1000) and the default container group (GID) is now 65532 (previously 0) ([#&#8203;8408](cert-manager/cert-manager#8408), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- The feature-gate DefaultPrivateKeyRotationPolicyAlways moved from Beta to GA and can no longer be disabled. ([#&#8203;8287](cert-manager/cert-manager#8287), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- Update cert-manager's ACME client, forked from golang/x/crypto ([#&#8203;8268](cert-manager/cert-manager#8268), [@&#8203;SgtCoDFish](https://github.com/SgtCoDFish))
- Use the latest version of Kyverno (1.16.2) in the best-practice installation tests ([#&#8203;8389](cert-manager/cert-manager#8389), [@&#8203;wallrj-cyberark](https://github.com/wallrj-cyberark))
- We stopped testing with Coutour due to it not supporting the new XListenerSet resource, and moved to kgateway. ([#&#8203;8426](cert-manager/cert-manager#8426), [@&#8203;hjoshi123](https://github.com/hjoshi123))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41OS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiY2hhcnQiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/4582
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. area/api Indicates a PR directly modifies the 'pkg/apis' directory area/deploy Indicates a PR modifies deployment configuration area/testing Issues relating to testing dco-signoff: yes Indicates that all commits in the pull request have the valid DCO sign-off message. kind/feature Categorizes issue or PR as related to a new feature. lgtm Indicates that a PR is ready to be merged. ok-to-test release-note Denotes a PR that will be considered when it comes time to generate release notes. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. tide/merge-method-squash Denotes a PR that should be squashed by tide when it merges.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement XListenerSet

7 participants