Let's Encrypt / ACME DNS-01
Obtain automatic TLS certificates using the DNS-01 challenge — DomU DNS handles the _acme-challenge TXT records directly. No HTTP port 80 required.
Prerequisites
- DomU DNS is publicly reachable on port
53(TCP + UDP) - Your domain's NS records point to your DomU DNS instance
- A Named API Key (see Step 1 below)
_acme-challenge.<domain> TXT.
Step 1: Create a Named API Key
Named API keys are dedicated keys for external tools — separate from your root API key. Create one in the dashboard:
- Open the Dashboard → Settings → Security
- Scroll to API Keys → click + New API Key
- Enter a name (e.g. Traefik ACME) and save
- Copy the key — it is shown only once
Option A: Traefik (httpreq provider)
Traefik's built-in httpreq DNS provider uses Basic Auth. The Named API Key is used as the HTTP password.
Static configuration (traefik.yml)
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /acme/acme.json
dnsChallenge:
provider: httpreqEnvironment variables
HTTPREQ_ENDPOINT=http://<domudns-ip>/api/acme/httpreq HTTPREQ_USERNAME=traefik # any string HTTPREQ_PASSWORD=<named-api-key> # from DomU DNS dashboard
Traefik will call POST /api/acme/httpreq/present with the DNS-01 token and POST /api/acme/httpreq/cleanup after validation.
Option B: Certbot DNS Plugin
Install the certbot-dns-domudns plugin, then use it like any other Certbot DNS plugin.
Install
pip install certbot certbot-dns-domudns
Credentials file /etc/letsencrypt/domudns.ini
dns_domudns_url = http://<domudns-ip> dns_domudns_api_key = <named-api-key>
chmod 600 /etc/letsencrypt/domudns.ini
Issue certificate (staging)
certbot certonly \ --authenticator dns-domudns \ --dns-domudns-credentials /etc/letsencrypt/domudns.ini \ --server https://acme-staging-v02.api.letsencrypt.org/directory \ -d example.com -d '*.example.com'
Issue certificate (production)
certbot certonly \ --authenticator dns-domudns \ --dns-domudns-credentials /etc/letsencrypt/domudns.ini \ -d example.com -d '*.example.com'
Option C: acme.sh
Copy the hook script from the DomU DNS repository and use it with acme.sh.
Install acme.sh and the hook
# Install acme.sh curl https://get.acme.sh | sh # Copy DomU DNS hook script cp /path/to/domudns/scripts/dns_domudns.sh ~/.acme.sh/dnsapi/ chmod +x ~/.acme.sh/dnsapi/dns_domudns.sh
Issue certificate
export DOMUDNS_URL=http://<domudns-ip> export DOMUDNS_API_KEY=<named-api-key> acme.sh --issue --dns dns_domudns -d example.com -d '*.example.com'
Option D: Proxmox Cluster
Proxmox VE uses acme.sh internally for ACME certificate management. The DomU DNS plugin must be installed manually on every node in the cluster.
Step 1 — Copy the plugin file to all nodes
Run this on a machine that has SSH access to all Proxmox nodes:
for node in pve1 pve2 pve3; do
scp dns_domudns.sh root@${node}:/usr/share/proxmox-acme/dnsapi/dns_domudns.sh
ssh root@${node} chmod +x /usr/share/proxmox-acme/dnsapi/dns_domudns.sh
doneStep 2 — Register the plugin in the Proxmox schema
Proxmox reads /usr/share/proxmox-acme/dns-challenge-schema.json to populate the DNS API dropdown in the UI. Run the following on every node:
python3 -c "
import json
with open('/usr/share/proxmox-acme/dns-challenge-schema.json', 'r') as f:
schema = json.load(f)
schema['domudns'] = {
'name': 'DomU DNS',
'fields': {
'DOMUDNS_URL': {
'description': 'Base URL of the DomU DNS instance (no trailing slash)',
'type': 'string'
},
'DOMUDNS_API_KEY': {
'description': 'Named API key from DomU DNS dashboard',
'type': 'string'
}
}
}
with open('/usr/share/proxmox-acme/dns-challenge-schema.json', 'w') as f:
json.dump(schema, f, indent=3, sort_keys=True)
print('Done')
"
systemctl restart pvedaemon pveproxylibproxmox-acme-plugins package. An apt upgrade may overwrite it — re-run Step 2 after package updates.
Step 3 — Add the DNS plugin (once, cluster-wide)
In the Proxmox web UI: Datacenter → ACME → DNS Plugins → Add
| Plugin ID | domudns |
| DNS API | domudns (select from dropdown) |
| API Data | DOMUDNS_URL=http://<domudns-ip>DOMUDNS_API_KEY=<named-api-key> |
Step 4 — Configure certificate per node
For each node: Node → System → Certificates → ACME → Add Domain
- Challenge type: DNS
- Plugin: domudns
- Domain:
pve1.example.com(use the node's FQDN)
Then click Order Certificates Now.
Manual API Test
Verify the full flow before using an ACME client:
API=http://<domudns-ip> KEY=<named-api-key> # 1. Store challenge curl -X POST $API/api/acme/dns-01/present \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"domain":"example.com","txt_value":"test-token-123"}' # 2. Query DNS — must return "test-token-123" dig @<domudns-ip> _acme-challenge.example.com TXT # 3. Remove challenge curl -X POST $API/api/acme/dns-01/cleanup \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{"domain":"example.com"}'