Delegated DNS-01 (dashboard)¶
For native Agent setup and challenge ownership, see Agent workflow usage.
Let CertIntel answer the ACME dns-01 challenge for a hostname you control,
without giving your ACME client write access to your real DNS zone. You create a
record, add one CNAME, and point your ACME client's update credential at it -
CertIntel's authoritative DNS service answers the challenge from then on.
This page covers creating and managing a delegation record from the dashboard. For
using it in a native CertIntel Agent workflow, see
Delegated DNS-01 in the Agent. Other ACME clients can
use the CertIntel plugins for simple-acme, win-acme,
Posh-ACME, Certbot and acme.sh, the native API (PUT /api/v1/dns-delegations/{id}/txt), or the built-in
acme-dns-compatible shim; the DNS setup below is the same. The Agent does not
expose its provider as a general-purpose validation script hook.
Creating a record¶
Get a certificate for a server on the dashboard's Overview creates the
records a certificate needs (one per name), shows the CNAME to add for each
with a Check DNS button, and checks that every CNAME resolves before it
proposes the certificate to the server. If you already use certbot, acme.sh,
Posh-ACME or another ACME client, you need no Agent: the introduction of Get a
certificate for a server links to Delegated DNS-01 with the new-record
form open (/dns-delegations?create=1), and the page shown after creating the
record gives each client its configuration (see
Pointing your ACME client at it). You can
also create a record by hand:
On Delegated DNS-01 → New delegation record, enter the domain name you
want validated (e.g. shop.example.com) and pick a child organization (the one
selected in the top bar, or the only one you can choose, is pre-selected). CertIntel generates a random
32-character subdomain under its own zone and a one-time update secret, then
shows you the exact DNS record to add:
Copy buttons are provided for both the record name and the value, so you can paste
them straight into your DNS provider without retyping. Most DNS providers'
forms take the record name relative to the zone and add the zone themselves:
CertIntel finds the name's zone in DNS (walking up from the name, the first
name that is a zone of its own) and, for a name at its zone or directly below
it, also shows that short form with its own Copy button (If your DNS
provider adds the zone example.com itself (most do), enter only:
_acme-challenge.shop). For a name further below its zone, or when it cannot
read the zone, it guesses no value, because your provider may show a zone in
between: it says to enter only the part before your zone's name, as your
provider shows it next to the field (for
_acme-challenge.web.shop.example.com in the zone shop.example.com, that
is _acme-challenge.web). Get a certificate for a
server shows the same. Use the generated label
verbatim: CertIntel's DNS answers only for labels of exactly that shape, so a
shortened or altered target never resolves.
One record covers both the base domain and its wildcard - shop.example.com
and *.shop.example.com both resolve the ACME challenge from the same
_acme-challenge.shop.example.com name, so you never need a second CNAME for the
wildcard.
The address /dns-delegations?create=1 opens the Delegated DNS-01 page with
the New delegation record form already open; links from elsewhere in the
dashboard use it.
Cloudflare users
Set this record to DNS only (grey cloud), not proxied. A proxied (orange cloud) record answers Cloudflare's own IP, not the CNAME target, and the ACME challenge will never resolve.
Pointing your ACME client at it¶
The page that shows the new record's secret, and later the record's own page, has a Use this delegation with… card. It lists the four values every client needs - Delegation ID, CNAME target, API base (the right address for your workspace on this deployment) and Update secret - and one section per client with its configuration filled in, ready to copy:
| Section | What it gives |
|---|---|
| CertIntel Agent | Use the delegation in a workflow assignment (the Agent gets its own credential when it approves; nothing to copy), or the values for the Agent's own form, where the Delegation ID goes in Username. |
| certbot | The credentials file (it creates /etc/certintel only when missing, as 0755, because the CertIntel Agent reads that folder too, and the file itself as 0600) and the certonly command for the web server you choose (NGINX, Apache, Nothing to reload), with its --deploy-hook and a First run, without a terminal variant that adds --non-interactive --agree-tos -m and your email address. Add --test-cert to get a test certificate from Let's Encrypt's staging service (not trusted by browsers; leave it out for the real one), or --dry-run to rehearse against staging without saving a certificate. |
| acme.sh | The five CERTINTEL_* variables and the issue command (with --server letsencrypt and --domain-alias). |
| Posh-ACME | The plugin arguments; PowerShell asks for the secret. |
| simple-acme / win-acme | The arguments for an unattended setup. |
| Other acme-dns clients (cert-manager, lego, …) | The acme-dns account (below) and a native API call. |
The secret appears in the blocks only on the page that shows it once; the
record's own page shows YOUR-DELEGATION-SECRET in its place (Rotate
secret gives a new one).
For simple-acme, win-acme, Posh-ACME, Certbot or acme.sh, install the plugin
from the corresponding plugin installation guide. Each plugin
uses the Delegation ID, CNAME target, API base and update secret. The native DLL and Posh-ACME plugins save credentials through the
client; Certbot uses a private JSON mapping file; acme.sh saves the
CERTINTEL_* settings in its account configuration.
CertIntel speaks the acme-dns update protocol, so most ACME clients with
an acme-dns plugin (cert-manager, lego, acme.sh, certbot-dns-acmedns, and
others) work directly. Only POST /acme-dns/update is implemented;
/acme-dns/register answers 403 (registration is disabled; create a
Delegated DNS-01 record in the CertIntel …) on every address that serves
/acme-dns/update, on purpose, because registration is what you did on the
dashboard when you created the record. Fill the client's acme-dns
account from the record's detail page:
| Setting | Value |
|---|---|
| server / base URL | the API base's origin followed by /acme-dns, as the card shows it (for the hosted service https://api.certin.tel/acme-dns); clients add /update to it |
username (X-Api-User) |
the Delegation ID |
password (X-Api-Key) |
the update secret (shown once at creation) |
| subdomain | the generated subdomain (an update naming a different subdomain is rejected) |
| fulldomain | the full CNAME target shown above |
Or use the native API directly:
curl -X PUT https://<update-base>/api/v1/dns-delegations/<id>/txt \
-H "X-Api-Key: <secret>" \
-H "Content-Type: application/json" \
-d '{"values": ["<acme-challenge-value>"]}'
Up to two TXT values are kept live at once on the same name, so an apex + wildcard
pair validating in the same run doesn't clobber either value; a request with more
than two values is rejected. Updates are accepted only from the update secret;
an Agent's own API key does not authenticate them (see
Delegated DNS-01 in the Agent).
GET (and PUT) on …/dns-delegations/<id>/txt answer with the record's
subdomain, its current values and its cname_target, the full CNAME
destination (null on a deployment without a delegation zone):
{
"subdomain": "k7q2m4x6z3b3n5p7r6t2v4w6y5c3d5f7",
"values": [],
"cname_target": "k7q2m4x6z3b3n5p7r6t2v4w6y5c3d5f7.dns01.certin.tel"
}
The CertIntel Agent uses cname_target to check a delegation, so it needs no
CNAME destination typed in (Agent 1.8.0+).
A tenant administrator can switch TXT updates off for the whole workspace on
Settings → Security under What your agents may submit (DNS-01
challenge updates, covering both /acme-dns/update and the native txt route); the
records and their CNAMEs stay in place, only updates are refused until it is
turned back on.
A TXT value is at most 255 characters of ASCII (an ACME challenge value is
base64url); anything longer, or with other characters, is refused - 422 from
the native API, 400 from /acme-dns/update - instead of being stored and
breaking the record's DNS answer. A value set more than two hours ago is no
longer served, returned or kept on the next update, so a value a client failed
to clean up stops blocking new challenges on its own. Reading the record
(GET …/txt) has its own rate limit, separate from updates, and a rate-limited
request answers 429 with a Retry-After header saying how long to wait.
CAA records¶
Each domain on the Delegated DNS-01 list shows a CAA line under its name:
CAA: any CA, only <issuer names> (with wildcards: … when issuewild
differs), every CA refused (critical record), not applicable or CAA lookup
failed; hover it for where the deciding records were found. A record's page has
a CAA records card: the records that decide for the domain and its
wildcard (or that there are none, so any CA may issue), and for each ACME
account of the organization you can see, whether its CA may issue, with the
exact record to add when it may not. Without such an account the card checks
Let's Encrypt, labelled the default CA. See
CAA records for how the check
reads the records.
Managing a record¶
- Rotate secret issues a new update secret; the old one stops working immediately. The record's id, subdomain, and CNAME target don't change, so you don't need to touch DNS again.
- Revoke stops the record answering (and stops accepting new TXT updates) without deleting it; Reactivate brings it back.
- Delete removes the record permanently.
- CNAME check: the list and the record's page say whether
_acme-challenge.<name>in public DNS points at the record's CNAME target - CNAME OK, CNAME points elsewhere, CNAME missing or Check failed (the lookup failed; retried automatically) - and, for a problem, the exact record to change or add in your DNS zone. CertIntel checks through public resolvers: a new record a few minutes after it is created (every 5 minutes during its first hour while the CNAME is missing, points elsewhere or cannot be looked up), whenever its page is opened, when an Agent reports a certificate issued for one of its names (also when installing it then failed) while its last check was not CNAME OK, and every few hours afterwards. Until then the page says Not checked yet: add the CNAME below at your DNS provider, then Check now. Check CNAMEs now (list) and Check now (record) check at once. A CNAME that points at the target of another of the organization's records names that record (… the target of the record for …: a copy-paste mix-up?). A record whose CNAME is missing or points elsewhere is listed under Needs attention on the Overview. See DNS-01 validation fails with a delegated record.
Native Agent workflows store the delegation's scoped update secret in the local protected secret store. Use Edit workflow… → DNS delegations (Windows) or the terminal interface's Settings screen (Linux) to test or replace it after a dashboard rotation.
Rotating or revoking the update secret never affects the CNAME your DNS zone already publishes - only the credential used to update the TXT value changes.
The record's Recent updates table lists each TXT change. From is the address CertIntel received the update from: behind NAT or a proxy it is the address of that NAT device or proxy, not the server's own.