Skip to content

feat: Support Ingress annotation override for HTTP-01 ingressClassName#8244

Merged
cert-manager-prow[bot] merged 1 commit intocert-manager:masterfrom
lunarwhite:ingress-anno
Nov 19, 2025
Merged

feat: Support Ingress annotation override for HTTP-01 ingressClassName#8244
cert-manager-prow[bot] merged 1 commit intocert-manager:masterfrom
lunarwhite:ingress-anno

Conversation

@lunarwhite
Copy link
Copy Markdown
Member

@lunarwhite lunarwhite commented Nov 11, 2025

This PR implements a new acme.cert-manager.io/http01-ingress-ingressclassname Ingress annotation, to enable users to configure annotation-based override for HTTP01 solver's ingressClassName field in ACME Issuer.

This reduces operational complexity and the likelihood of user misconfiguration. Notably it also maintains strict backward compatibility with the existing acme.cert-manager.io/http01-ingress-class annotation - users who want to override the value of the kubernetes.io/ingress.class Ingress annotation can still make use of it.

sequenceDiagram
    participant User
    participant Ingress
    participant CertShim as Certificate-Shim
    participant Cert as Certificate
    participant Orders as ACME Orders
    participant Challenge as HTTP01 Challenge

    User->>Ingress: Create Ingress with new annotation
    Note over User,Ingress: acme.cert-manager.io/http01-ingress-ingressclassname
    CertShim->>Ingress: Watch and reconcile
    CertShim->>Cert: Create Certificate with override annotation
    Note over CertShim,Cert: acme.cert-manager.io/http01-override-ingress-ingressclassname
    Orders->>Cert: Process Certificate request
    Orders->>Orders: Validate mutual exclusivity
    Orders->>Challenge: Create HTTP01 challenge with custom ingressClassName
    Challenge->>Challenge: Apply ingressClassName override
Loading

Please refer to this design proposal for the full context.

Pull Request Motivation

Closes #6184

Currently cert-manager supports annotation-based overrides for http01.ingress.class via annotation acme.cert-manager.io/http01-ingress-class. But the same capability is missing for http01.ingress.ingressClassName spec field. This inconsistency could easily break the user experience and would likely cause misconfigurations, resulting in a "conflict".

It would also eliminate the requirement to set up a dedicated Issuer for every Ingress controller/class, as #6184 (comment) and #6651 (comment) reported.

E2E Verification

Issuer with ingressClassName

with new Ingress annotation to override `ingressClassName`
# create Issuer with ingressClassName
k apply -f - << EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-universal
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-http01-resources
    solvers:
    - http01:
        ingress:
          ingressClassName: fake
EOF

# create Ingress with new annotation
k apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-universal
    acme.cert-manager.io/http01-ingress-ingressclassname: nginx
  name: pebble
  namespace: pebble
spec:
  ingressClassName: nginx
  rules:
  - host: pebble.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: pebble
            port:
              number: 443
  tls:
  - hosts:
    - pebble.com
    secretName: pebble-cert
EOF

# check Ingress, Challenge, Certificate objects value should be override properly
k get ingress -n pebble -o yaml
...
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::
  name: cm-acme-http-solver-k8nh8
  namespace: pebble
spec:
  ingressClassName: nginx
...

k get challenge -n pebble -o yaml
...
  spec:
    solver:
      http01:
        ingress:
          ingressClassName: nginx
...

k get certificate -n pebble -o yaml
...
  metadata:
    annotations:
      acme.cert-manager.io/http01-override-ingress-ingressclassname: nginx
    name: pebble-cert
    namespace: pebble
...
with old Ingress annotation to override `Class`
# create Ingress with old annotation
k apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-universal
    acme.cert-manager.io/http01-ingress-class: nginx
  name: pebble
  namespace: pebble
spec:
  ingressClassName: nginx
  rules:
  - host: pebble.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: pebble
            port:
              number: 443
  tls:
  - hosts:
    - pebble.com
    secretName: pebble-cert
EOF

# check Ingress, Challenge, Certificate objects value should be override properly
k get ingress -n pebble -o yaml
...
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::/0
  name: cm-acme-http-solver-q2fs6
  namespace: pebble
...

k get challenge -n pebble -o yaml
...
  spec:
    solver:
      http01:
        ingress:
          class: nginx
...

k get certificate -n pebble -o yaml
...
  metadata:
    annotations:
      acme.cert-manager.io/http01-override-ingress-class: nginx
    name: pebble-cert
    namespace: pebble
...
with both Ingress annotations

covered by UT - ACME Order creation fails with validation error

Issuer with class

with new Ingress annotation to override `ingressClassName`
# create Issuer with class
k apply -f - << EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-universal
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-http01-resources
    solvers:
    - http01:
        ingress:
          class: fake
EOF

# create Ingress with new annotation

# check Ingress, Challenge, Certificate objects value should be override properly
k get ingress -n pebble -o yaml
...
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::/0
  name: cm-acme-http-solver-k8nh8
  namespace: pebble
spec:
  ingressClassName: nginx
...

k get challenge -n pebble -o yaml
...
  spec:
    solver:
      http01:
        ingress:
          ingressClassName: nginx
...

k get certificate -n pebble -o yaml
...
  metadata:
    annotations:
      acme.cert-manager.io/http01-override-ingress-ingressclassname: nginx
    name: pebble-cert
    namespace: pebble
...
with old Ingress annotation to override `Class`
# create Ingress with legacy annotation

# check Ingress, Challenge, Certificate objects value should be override properly
k get ingress -n pebble -o yaml
...
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::/0
  name: cm-acme-http-solver-tcr9t
  namespace: pebble
...

k get challenge -n pebble -o yaml
...
  spec:
    solver:
      http01:
        ingress:
          class: nginx
...

k get certificate -n pebble -o yaml
...
  metadata:
    annotations:
      acme.cert-manager.io/http01-override-ingress-class: nginx
    name: pebble-cert
    namespace: pebble
...
with no Ingress annotation for override
# create Ingress with neither annotation
k apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-universal
  name: pebble
  namespace: pebble
spec:
  ingressClassName: fake
  rules:
  - host: pebble.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: pebble
            port:
              number: 443
  tls:
  - hosts:
    - pebble.com
    secretName: pebble-cert
EOF

# check Ingress, Challenge, Certificate objects value should not be overridden (uses solver's configs)
k get ingress -n pebble -o yaml
...
metadata:
  annotations:
    kubernetes.io/ingress.class: fake
    nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::/0
  name: cm-acme-http-solver-x4h6c
  namespace: pebble
...

k get challenge -n pebble -o yaml
...
  spec:
    solver:
      http01:
        ingress:
          class: fake
...

k get certificate -n pebble -o yaml
...
  metadata:
    name: pebble-cert
    namespace: pebble
...
with both Ingress annotations

covered by UT - ACME Order creation fails with validation error

[Multiple solvers] Issuer with ingressClassName and class

with new Ingress annotation to override `ingressClassName`
# create Issuer with ingressClassName + class
k apply -f - << EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-universal
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-http01-resources
    solvers:
    - http01:
        ingress:
          ingressClassName: fake
      selector:
        dnsZones:
          - pebble-new.com
    - http01:
        ingress:
          class: fake
      selector:
        dnsZones:
          - pebble-legacy.com
EOF

# create Ingress with new annotation
k apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-universal
    acme.cert-manager.io/http01-ingress-ingressclassname: nginx
  name: pebble
  namespace: pebble
spec:
  ingressClassName: nginx
  rules:
  - host: a.pebble-new.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: pebble
            port:
              number: 443
  tls:
  - hosts:
    - a.pebble-new.com
    secretName: pebble-cert
EOF

# check Ingress, Challenge, Certificate objects value should be override properly
k get ingress -n pebble -l acme.cert-manager.io/http01-solver="true" -o yaml
...
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::/0
  name: cm-acme-http-solver-tcr9t
  namespace: pebble
spec:
  ingressClassName: nginx
  rules:
  - host: a.pebble-new.com
...

k get challenge -n pebble -o yaml
...
  spec:
    solver:
      http01:
        ingress:
          ingressClassName: nginx
      selector:
        dnsZones:
        - pebble-new.com
...

k get certificate -n pebble -o yaml
...
  metadata:
    annotations:
      acme.cert-manager.io/http01-override-ingress-ingressclassname: nginx
    name: pebble-cert
    namespace: pebble
...
with old Ingress annotation to override `Class`
# create ingress with legacy annotation
k apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-universal
    acme.cert-manager.io/http01-ingress-class: nginx
  name: pebble
  namespace: pebble
spec:
  ingressClassName: nginx
  rules:
  - host: b.pebble-legacy.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: pebble
            port:
              number: 443
  tls:
  - hosts:
    - b.pebble-legacy.com
    secretName: pebble-cert
EOF

# check Ingress, Challenge, Certificate objects value should be override properly
k get ingress -n pebble -l acme.cert-manager.io/http01-solver="true" -o yaml
...
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0,::/0
  name: cm-acme-http-solver-tcr9t
  namespace: pebble
spec:
  rules:
  - host: b.pebble-legacy.com
...

k get challenge -n pebble -o yaml
...
    solver:
      http01:
        ingress:
          class: nginx
      selector:
        dnsZones:
        - pebble-legacy.com
...

k get certificate -n pebble -o yaml
...
  metadata:
    annotations:
      acme.cert-manager.io/http01-override-ingress-class: nginx
    name: pebble-cert
    namespace: pebble
...

Kind

/kind feature

Release Note

Introduce a new Ingress annotation `acme.cert-manager.io/http01-ingress-ingressclassname` to override `http01.ingress.ingressClassName` field in HTTP-01 challenge solvers.

…` Ingress annotation, to override HTTP01 solver's `ingressClassName` field in ACME Issuer

Signed-off-by: Yuedong Wu <dwcn22@outlook.com>
@cert-manager-prow cert-manager-prow bot added kind/feature Categorizes issue or PR as related to a new feature. release-note Denotes a PR that will be considered when it comes time to generate release notes. dco-signoff: yes Indicates that all commits in the pull request have the valid DCO sign-off message. area/acme Indicates a PR directly modifies the ACME Issuer code area/api Indicates a PR directly modifies the 'pkg/apis' directory size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels Nov 11, 2025
@lunarwhite lunarwhite changed the title Add support for `acme.cert-manager.io/http01-ingress-ingressclassname… feat: Support Ingress annotation override for HTTP-01 IngressClassName Nov 11, 2025
@lunarwhite lunarwhite changed the title feat: Support Ingress annotation override for HTTP-01 IngressClassName feat: Support Ingress annotation override for HTTP-01 ingressClassName Nov 11, 2025
@lunarwhite
Copy link
Copy Markdown
Member Author

/cc @maelvls

Please kindly add this to your review queue, thanks in advance!

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 introduces a new Ingress annotation acme.cert-manager.io/http01-ingress-ingressclassname to enable annotation-based override of the ingressClassName field in HTTP-01 challenge solvers. This enhancement addresses a gap in functionality where users could override the legacy class field but not the newer ingressClassName field, reducing the need for multiple Issuers for different Ingress classes.

Key Changes

  • Added new annotation constants for overriding ingressClassName in both Ingress and Certificate resources
  • Extended setIssuerSpecificConfig to handle the new annotation alongside the existing class override
  • Enhanced applyIngressParameterAnnotationOverrides to support the new override with mutual exclusivity validation
  • Comprehensive test coverage for all mutual exclusivity scenarios between the three override types (name, class, ingressClassName)

Reviewed Changes

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

Show a summary per file
File Description
pkg/apis/certmanager/v1/types.go Added IngressACMEIssuerHTTP01IngressClassNameAnnotationKey constant for the new Ingress annotation
pkg/apis/acme/v1/types.go Added ACMECertificateHTTP01IngressClassNameOverride constant for Certificate/Order annotation
internal/apis/certmanager/types.go Added internal annotation constant for consistency
pkg/controller/certificate-shim/sync.go Extended setIssuerSpecificConfig to process the new annotation and set it on the Certificate
pkg/controller/certificate-shim/sync_test.go Added test cases for the new annotation handling and empty value scenarios
pkg/controller/acmeorders/util.go Enhanced mutual exclusivity validation to include the new override annotation
pkg/controller/acmeorders/util_test.go Added comprehensive test cases for all mutual exclusivity combinations with the new override

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

// This is especially useful for users deploying many different ingress
// classes into a single cluster that want to be able to re-use a single
// solver for each ingress class.
ACMECertificateHTTP01IngressClassNameOverride = "acme.cert-manager.io/http01-override-ingress-ingressclassname"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

tiny nit: this doesn't match the diagram (excellent diagram by the way!! I never thought of using mermaid, I'll use that from now on)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Good catch! Updated the name in the diagram

@maelvls
Copy link
Copy Markdown
Member

maelvls commented Nov 18, 2025

Hey! This looks great, I'd be happy to approve right away. The only comment Codex had was:

Couldn’t find any e2e/integration test that exercises ACMECertificateHTTP01IngressClassNameOverride, so regressions in the new override path would only be caught by unit tests. Consider adding an HTTP‑01 scenario in test/e2e to cover it end-to-end.

I'm OK with the unit tests (which rely on the "fake clientset"). I'm confident enough with just the tests you added.

/approve
/lgtm
/hold so that you can merge this once you are ready

@cert-manager-prow cert-manager-prow bot added do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. lgtm Indicates that a PR is ready to be merged. labels Nov 18, 2025
@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 Nov 18, 2025
@lunarwhite
Copy link
Copy Markdown
Member Author

/unhold

@cert-manager-prow cert-manager-prow bot removed the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Nov 19, 2025
@cert-manager-prow cert-manager-prow bot merged commit 8b1c8d9 into cert-manager:master Nov 19, 2025
11 of 12 checks passed
@lunarwhite lunarwhite deleted the ingress-anno branch November 19, 2025 02:43
@wallrj-cyberark
Copy link
Copy Markdown
Member

📢 The fix or feature is now available for testing in an alpha release

Please test and report back.

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/acme Indicates a PR directly modifies the ACME Issuer code area/api Indicates a PR directly modifies the 'pkg/apis' directory 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. release-note Denotes a PR that will be considered when it comes time to generate release notes. size/L Denotes a PR that changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Conflicting ingressClassName http01 issuer spec and acme.cert-manager.io/http01-ingress-class annotation

4 participants