A cert-manager sample repository for creating an ACME DNS01 solver webhook
Find a file
2026-02-23 08:48:33 +01:00
.github/workflows feat: add helm chart build and publish 2026-02-15 20:45:59 +01:00
deploy/cert-manager-desec-webhook fix: update default values to download latest image 2026-02-21 09:26:13 +01:00
solver fix: change solver name because of upstream constraint 2026-02-21 09:34:23 +01:00
testdata/desec fix: fix values, add testdata, remove empty notes 2026-02-15 00:19:05 +01:00
.gitignore fix: add secret to gitignore to ensure only template exists 2026-02-15 00:21:00 +01:00
Dockerfile fix: remove invalid chmod from runtime container 2026-02-23 07:50:13 +01:00
go.mod fix: downgrade k8s client to 1.34.4 2026-02-21 09:17:53 +01:00
go.sum fix: downgrade k8s client to 1.34.4 2026-02-21 09:17:53 +01:00
LICENSE Initial commit 2019-04-15 15:23:59 +01:00
main.go fix: most simple copilot suggestions 2026-02-14 23:54:45 +01:00
main_test.go Apply review feedback: fix variable shadowing, use TEST_ZONE_NAME env var, fix README typos and solverName 2026-02-21 07:45:45 +00:00
README.md feat: improve README of the webhook 2026-02-23 08:48:33 +01:00
renovate.json chore(deps): add renovate.json 2025-12-09 20:54:05 +00:00

Cert Manager DeSEC Webhook

cert-manager project logo

Publish Docker Image to GHCR Publish Helm chart to GHCR Helm Chart Architectures License Go Version

Independently maintained ACME webhook for the desec.io DNS API. API docs: https://desec.readthedocs.io/en/latest/

Requirements

Supported architectures

  • linux/amd64
  • linux/arm64

Installation

Using helm from local checkout

helm install \
  -n cert-manager \
  desec-webhook \
  deploy/cert-manager-desec-webhook

Using public helm chart

helm install \
  -n cert-manager \
  --version <release without leading "v"> \
  desec-webhook \
  oci://ghcr.io/pr0ton11/helm/cert-manager-desec-webhook

Creating an issuer

Create a secret containing the credentials

apiVersion: v1
kind: Secret
metadata:
  name: desec-io-token
  namespace: cert-manager
type: Opaque
data:
  token: your-key-base64-encoded

We can also then provide a standardised 'testing framework', or set of conformance tests, which allow us to validate that a DNS provider works as expected. Create a 'ClusterIssuer' or 'Issuer' resource as the following:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: mail@example.com

    privateKeySecretRef:
      name: letsencrypt-staging

    solvers:
      - dns01:
          webhook:
            config:
              apiKeySecretRef:
                key: token
                name: desec-io-token
            groupName: acme.pr0ton11.github.com
            solverName: desec

Create a manual certificate

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-cert
  namespace: cert-manager
spec:
  commonName: example.com
  dnsNames:
    - example.com
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer
  secretName: example-cert

Using cert-manager with traefik ingress


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: bitwarden
  namespace: utils
  labels:
    app: bitwarden
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-staging
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/rewrite-target: /$1
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls: 'true'
spec:
  tls:
    - hosts:
        - bitwarden.acme.example.com
      secretName: bitwarden-crt
  rules:
    - host: bitwarden.acme.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: bitwarden
                port:
                  number: 80

Running the test suite

All DNS providers must run the DNS01 provider conformance testing suite, else they will have undetermined behaviour when used with cert-manager.

Provide a secret.yaml in testdata/desec

apiVersion: v1
kind: Secret
metadata:
  name: desec-token
data:
  token: your-key-base64-encoded
type: Opaque

Define a TEST_ZONE_NAME matching to your authentication credentials.

$ TEST_ZONE_NAME=example.com. make test

Stargazers over time

Star History Chart