cPanel has shipped native DNSSEC since v76 and the workflow has barely changed since: WHM generates a key per zone, signs the zone, prints a DS record, and waits for you to publish it at the registrar. The signing side is genuinely a one-click operation. Everything that goes wrong with DNSSEC on cPanel happens after that click — at the registrar, at the resolver, or during the first rollover six months later.
This guide is the end-to-end path: enable signing on a zone, push the DS record, verify the chain of trust, automate it across hundreds of domains, and avoid the two failure modes that take a zone offline for the duration of its TTL.
What WHM actually generates
Click Enable DNSSEC on a zone and cPanel does four things:
- Generates a key pair in
/var/cpanel/domain_keys/(ECDSA Curve P-256 / SHA-256 by default — algorithm 13). - Adds a
DNSKEYrecord to the zone. - Re-signs the zone, producing
RRSIGrecords for every RRset andNSECchain records for authenticated denial. - Prints a DS record — the fingerprint you publish at your registrar so the parent
.com/.net/.iozone vouches for your key.
By default cPanel uses a single CSK (combined signing key) rather than the classic KSK/ZSK split. One key signs everything. It's simpler, it's smaller on the wire, and the rollover story is straightforward — at the cost of needing a DS update at the registrar every time you rotate. For shared hosting that's the right trade.
Step 1 — Enable signing on a single zone
From the UI: WHM → Home → DNS Functions → DNSSEC Keys → pick the domain → Enable DNSSEC. From the command line, which scales:
whmapi1 enable_dnssec_for_domains domain=example.com
Then read the DS record back:
whmapi1 fetch_ds_records_for_domains domain=example.com
The output gives you three fields you'll need at the registrar: the key tag, the algorithm (13), the digest type (2 = SHA-256), and the digest itself.
"key_tag": "12345",
"algorithm": "13",
"digest_type": "2",
"digest": "A1B2C3D4E5F6..."
If the zone is part of a cPanel DNS cluster, enabling
DNSSEC on the primary syncs the keys and signed records to every DNSONLY peer
automatically — provided cluster trust is healthy. Verify on a peer with cat /var/named/example.com.db | grep RRSIG before declaring it done.
Step 2 — Publish the DS record at the registrar
This is the half of DNSSEC that cPanel can't do for you. Until the DS record exists in the parent zone, your signed zone is invisible to validating resolvers — they fall back to treating it as unsigned, so nothing breaks, but you also haven't gained anything.
The registrar UI varies, but the four fields are always the same: key tag, algorithm, digest type, digest. Paste them exactly. A single hex character off and the chain of trust is broken — and resolvers will return SERVFAIL for the entire zone the moment validation starts.
Some registrars (Cloudflare Registrar, Gandi, Porkbun) accept DS updates via API. If you operate at scale, wire this into your provisioning — manual paste is the single most common source of typos in any DNSSEC deployment.
Step 3 — Verify the chain of trust
Three commands cover the verification path:
# Is the zone serving DNSKEY?
dig +noall +answer DNSKEY example.com
# Is the parent serving the DS?
dig +noall +answer DS example.com @8.8.8.8
# Does a validating resolver accept the whole chain?
dig +dnssec +cd=0 example.com SOA @1.1.1.1
The third one is the test that matters. If the response includes ad in the flags
(flags: qr rd ra ad), the chain validates end-to-end. If it returns SERVFAIL, the chain
is broken — usually a DS/DNSKEY mismatch, occasionally a stale cached negative response
that times out within an hour.
For a one-shot end-to-end check including timeline visibility, DNSViz and Verisign's DNSSEC Debugger render the chain as a graph — useful for sending to a customer who's claiming "my DNSSEC is broken."
Step 4 — Roll out across all zones
For a host with hundreds of domains, sign them in a single pass and capture the DS records to a file your billing system can email to customers:
# Sign every cPanel-managed zone
for domain in $(whmapi1 listaccts --output=jsonpretty | jq -r '.data.acct[].domain'); do
whmapi1 enable_dnssec_for_domains domain="$domain"
whmapi1 fetch_ds_records_for_domains domain="$domain" \
--output=jsonpretty > "/root/dnssec-ds/${domain}.json"
done
Customers who manage their own registrar then have a self-serve handoff: send them the DS
record, link them to their registrar's DNSSEC docs, and follow up in 48 hours with dig DS
to confirm it landed. Customers whose domains are at a registrar you also operate — the
common case for hosting + domain bundles — can be automated end
to end.
Step 5 — Plan for the first rollover
DNSSEC keys should rotate. cPanel doesn't automate rollover, which means at some point you'll need to do it manually. The safe sequence is:
- Add a new key alongside the existing one (
whmapi1 add_dnssec_key). - Wait for the new DNSKEY to propagate everywhere — at least one full TTL, conservatively two.
- Publish the new DS at the registrar.
- Wait for the parent TTL on the old DS to fully expire from caches.
- Remove the old DS at the registrar.
- Wait for that change to propagate.
- Remove the old key from the zone.
Skip any of these waits and resolvers will hold a cached DS that points at a DNSKEY you've already deleted — SERVFAIL until their cache expires.
Common failure modes
- Algorithm mismatch. Registrar UI says "algorithm 8" but cPanel generated algorithm 13. SERVFAIL. Re-enter the registrar form with the correct number.
- Digest typo. One hex character off in a 64-character digest. Validators reject the whole chain. Copy-paste, never retype.
- DS pushed before signing complete. Window of a few seconds where the zone has no
DNSKEY served yet — but the DS is already public. Wait for
dig DNSKEYto succeed first. - Cluster sync lag. Enabling DNSSEC on the primary signs only the primary if cluster
trust is broken. Confirm with
dnssec-verify -o example.com /var/named/example.com.dbon every peer. - Forgetting subdomains served from a different DNS. If
mail.example.comis hosted externally (Microsoft 365, Google Workspace MX records), the parent zone signing only covers what cPanel serves. External records remain unsigned unless that provider signs them separately.
FAQ
Does cPanel support DNSSEC by default?+
What algorithm should I use for DNSSEC on cPanel?+
Why does my DNSSEC-enabled zone return SERVFAIL?+
How do I disable DNSSEC for a single domain?+
Does cPanel automate DNSSEC key rotation?+
Will enabling DNSSEC slow down DNS resolution?+
Next steps
- If you haven't built the underlying nameserver redundancy yet, the cPanel DNS cluster with DNSONLY guide is the prerequisite — DNSSEC on a single-server setup means a reboot takes the chain offline.
- For the mail-authentication half of the deliverability story, see SPF, DKIM, and DMARC on cPanel — DNSSEC doesn't sign DKIM keys but it does protect them from spoofing in transit.
- If you're sizing a fleet that needs DNSSEC across hundreds of zones, the cPanel license tier breakdown covers which tier supports the account counts you're planning.