DNSSEC Explained: Chain of Trust, DS Records, Key Rollover and NSEC3 in Production
Plain DNS answers are unauthenticated. A resolver that asks for www.example.com accepts whatever packet arrives first with the right transaction ID and source port, which is why cache poisoning remains a live attack class decades after Kaminsky. DNSSEC closes that gap by attaching public-key signatures to DNS data and linking each zone’s keys to its parent, all the way up to a root key that resolvers are configured to trust. When it works, a forged answer fails validation and the resolver returns SERVFAIL instead of the lie.
The catch is operational. DNSSEC moves DNS from a forgiving, best-effort system into one with hard cryptographic deadlines: signatures expire, parent and child key material must agree, and one stale DS record can make a healthy domain unreachable for every validating resolver on Earth. Most real DNSSEC pain is not cryptography; it is lifecycle management.
This article is a practitioner’s map of that lifecycle: how the chain of trust is built, how validation really proceeds, how to roll keys without an outage, what NSEC3 costs and buys you, and how to debug failures with dig.
What this covers: the record types (DNSKEY, RRSIG, DS, NSEC, NSEC3), KSK versus ZSK design, algorithm choice, the validation path, the three rollover methods, CDS/CDNSKEY automation, NSEC3 parameter guidance from RFC 9276, managed-provider behaviour (Route 53, Cloud DNS, Cloudflare), and a failure-mode triage flow.
Context and Background
DNSSEC is specified by a family of standards that the IETF consolidated in RFC 9364 (BCP 237, February 2023): the core is RFC 4033 (requirements), RFC 4034 (resource records) and RFC 4035 (protocol modifications), extended by RFC 6840 and supplemented by operational documents such as RFC 6781 (operational practices), RFC 5155 (NSEC3), RFC 5011 (automated trust-anchor updates), RFC 7344 and RFC 8078 (CDS/CDNSKEY) and RFC 9276 (NSEC3 parameter guidance). Those RFC numbers and titles are from the RFC Editor index; nothing below depends on any vendor’s marketing.
Deployment is uneven. The root zone has been signed since 2010, and most large ccTLDs and gTLDs are signed, so the top of the chain is solid. The weak points are second-level zones, where adoption depends on registrar support for publishing DS records, and the validation side, where a large share of resolvers are the big public ones (Google Public DNS, Cloudflare 1.1.1.1, Quad9) and ISP resolvers that may or may not validate. I am deliberately not quoting a global percentage here: validation and signing statistics vary by measurement method and month, and APNIC Labs and the registry operators publish live figures you should consult rather than trust a stale number in a blog post.
Why do teams still avoid DNSSEC? The honest reasons are availability risk and tooling. Unlike a TLS certificate that fails one site, a broken DNSSEC chain fails the whole zone, including email (MX and TXT lookups), API endpoints and internal service discovery that cross the public namespace. Anyone who has run a global traffic-steering design, such as the one covered in DNS anycast, GeoDNS and GSLB failover architecture, knows that GeoDNS and weighted answers are often synthesised per query, which complicates pre-signing and pushes many providers toward online signing.
The threat DNSSEC addresses is narrower than people assume. It provides data origin authentication and integrity for DNS responses, plus authenticated denial of existence. It does not encrypt queries (that is DNS over TLS, HTTPS or QUIC), it does not protect the stub-to-resolver hop unless the stub validates itself, and it does not stop an attacker who controls your registrar account. It is one layer: it makes DNS-derived trust decisions, like DANE, CAA checks and SPF lookups, defensible.
For the primary specification, see the RFC 4033 overview, and for the consolidated reading list see RFC 9364.
How the DNSSEC Chain of Trust Is Built
The DNSSEC chain of trust is a sequence of signed delegations. Each zone signs its own records with a ZSK, signs its DNSKEY set with a KSK, and publishes a hash of that KSK as a DS record in the parent, which signs it in turn. Validation walks upward until it meets the root trust anchor configured in the resolver.

Figure 1: The DNSSEC chain of trust. The resolver trusts only the root key; every other link is a DS-to-DNSKEY hash match plus an RRSIG verification.
Figure 1 shows the mechanism. The resolver starts with exactly one thing it trusts out of band: the root zone’s key-signing key, shipped as a trust anchor (a DS record or DNSKEY) in the resolver software or its root.key / bind.keys file. From that anchor it can verify the root DNSKEY RRset. The root contains a DS record for com, signed by the root ZSK. That DS contains a digest of the com KSK. The com DNSKEY RRset, once matched against the digest, authenticates the com ZSK, which signs the DS record for example.com. The cycle repeats at the leaf.
The five record types you must be able to read
A DNSKEY record (RFC 4034 section 2) carries a public key. Its flags field distinguishes the two roles: 256 is the Zone Key bit alone (conventionally a ZSK); 257 adds the Secure Entry Point bit (conventionally a KSK). The protocol field is always 3, and the algorithm field names the signature scheme. A derived value, the key tag, is a 16-bit checksum over the record that lets signatures and DS records point at the right key quickly. Key tags are not unique identifiers; collisions happen, and validators must try every key with a matching tag.
An RRSIG record covers one RRset (all records of the same name, class and type), never a single record. It contains the covered type, algorithm, label count, original TTL, signature expiration and inception (32-bit timestamps), the signer name, the key tag and the signature itself. The original TTL matters: validators reconstruct the signed data using the original TTL, not the decremented one the cache is serving.
A DS record lives in the parent zone, not the child. It holds a key tag, an algorithm number, a digest type and a digest of the child’s DNSKEY (owner name plus DNSKEY RDATA). Digest type 2 (SHA-256) is the sane default, and type 4 (SHA-384) is also defined. Digest type 1 (SHA-1) exists in the IANA registry for compatibility and should not be your choice for new delegations.
NSEC and NSEC3 records prove that a name or a type does not exist. Because signatures are made offline over fixed RRsets, a signed zone cannot sign “NXDOMAIN” on demand; instead it publishes a chain of records that cover the gaps between existing names. NSEC lists the next existing name in canonical order plus a bitmap of types at the current name. NSEC3 does the same over hashed names. We return to the trade-off in detail below.
KSK versus ZSK: why two keys
If DNSSEC used a single key, every key change would require a DS change in the parent, and the parent interaction is the slowest, most failure-prone step. The split fixes that. The ZSK (zone-signing key) signs every RRset in the zone and can be rotated entirely within your own operations, because only your DNSKEY RRset changes. The KSK (key-signing key) signs only the DNSKEY RRset, which is small, so you can afford a bigger key, an HSM, a slower rotation cadence and ceremony. RFC 6781 section 3.3 suggests lifetimes in this spirit: a KSK anchored by a parent DS around a year if you rotate regularly (or far longer if rollovers are never exercised, which it discourages), and a ZSK with online exposure on the order of a month.
Single-type signing, where one key serves both roles (a “CSK”), is legitimate and increasingly common in modern automation, including managed providers. It trades the operational split for simplicity: any rollover then involves the parent. Which design is right depends on whether you or your provider owns the signing pipeline, a point we return to in the provider section.
Choosing algorithms
Algorithm choice is defined by IANA numbers and graded in RFC 8624. From that RFC’s table: algorithm 8 (RSASHA256) is MUST for signing and validation; algorithm 13 (ECDSAP256SHA256) is MUST for signing and validation; algorithm 15 (ED25519) is RECOMMENDED for both; algorithm 14 (ECDSAP384SHA384) and 16 (ED448) are MAY for signing and RECOMMENDED for validation; algorithms 5, 7 and 10 (RSASHA1, RSASHA1-NSEC3-SHA1, RSASHA512) are NOT RECOMMENDED for signing.
The practical answer is algorithm 13. ECDSA P-256 signatures are 64 bytes and public keys are 64 bytes, against 256 bytes for RSA-2048 signatures, which matters because every DNSSEC response is larger than its unsigned equivalent and UDP fragmentation is a real failure source. Cloudflare’s documentation, for example, calls algorithm 13 its preferred choice, and Route 53’s customer-managed KSK requires an ECC_NIST_P256 KMS key. Ed25519 (algorithm 15) is smaller and faster still but validator and registrar support historically lagged; check your registrar’s DS algorithm menu before choosing it. Never mix this decision with an incidental platform migration: algorithm rollovers are the hardest rollover type (RFC 6781 section 4.1.4).
Validation Flow: What a Resolver Actually Does
Validation is recursive and cache-aware, but the logical sequence is fixed. A validating resolver sets the DO (“DNSSEC OK”) bit in its EDNS0 OPT record on upstream queries, which asks authoritative servers to include RRSIG and NSEC/NSEC3 records. It then evaluates the answer against the chain of trust and assigns one of four security statuses defined by RFC 4035: Secure, Insecure, Bogus or Indeterminate.

Figure 2: Validation sequence. The resolver fetches DNSKEY and DS material up the chain, then verifies the leaf RRSIG; a failure at any link produces SERVFAIL, not a partial answer.
In Figure 2 the resolver fetches the root DNSKEY RRset and checks it against its trust anchor, asks the com servers for the DS of example.com, fetches the example.com DNSKEY RRset, checks that some DNSKEY hashes to the DS, verifies the DNSKEY RRset’s RRSIG with that key, and finally verifies the RRSIG over the answer using a ZSK from that now-trusted set. Only then does the resolver set the AD (Authenticated Data) bit when answering its client.
The status distinction deserves care. Secure means a complete chain from a trust anchor exists. Insecure means the resolver proved there is no DS for the delegation, so unsigned data is legitimate; this is how every unsigned domain keeps working. Bogus means a chain was expected (a DS exists, or a signature is present) but something failed to verify: expired RRSIG, missing key, DS with no matching DNSKEY, or broken NSEC proof. Bogus data yields SERVFAIL to clients. Modern resolvers also attach an Extended DNS Error (RFC 8914) explaining the cause: code 6 is “DNSSEC Bogus”, code 7 “Signature Expired”, code 9 “DNSKEY Missing”, and code 10 “RRSIGs Missing” are the ones you will meet most often in logs.
The most important consequence is the asymmetry between Insecure and Bogus. An attacker cannot downgrade a signed zone to unsigned by deleting signatures, because the resolver already holds (or fetches) a signed DS from the parent saying “this child is signed.” That makes the parent’s DS record the single decision point for whether the child’s DNSSEC is enforced. It is also why removing DNSSEC cleanly means deleting the DS first, waiting for caches to expire, and only then removing the keys.
A dig walkthrough
You can inspect every link with dig. The commands below use example.com as a placeholder; substitute a domain you operate. First, the zone’s keys and signatures:
# 1. Public keys, plus the KSK/ZSK flags and the RRSIG that covers them
dig +dnssec DNSKEY example.com @a.iana-servers.net
# 2. The DS record as published by the PARENT (query a .com server directly)
dig +norecurse DS example.com @a.gtld-servers.net
# 3. Compute the DS you expect from the child's KSK and compare digests
dig +short DNSKEY example.com | grep '^257' > ksk.txt
# (use dnssec-dsfromkey from BIND utils, or `delv` for end-to-end validation)
dnssec-dsfromkey -2 -f ksk.txt example.com
# 4. Ask a validating resolver and look for the "ad" flag
dig +dnssec www.example.com @1.1.1.1
# 5. Local full-chain trace with the validator that ships with BIND
delv +vtrace www.example.com A
# 6. Bypass validation to separate DNSSEC failure from plain DNS failure
dig +cd www.example.com @1.1.1.1
What to look for: in step 1, a 257 flags DNSKEY is the KSK and 256 is the ZSK, and the RRSIG DNSKEY line shows the signer and expiry. In step 2, the DS key tag and digest type must equal the values from step 3 computed from the live KSK; a mismatch is the single most common outage cause. In step 4, the ad flag in the header proves the resolver validated. In step 6, +cd sets “Checking Disabled”: if the query fails normally but succeeds with +cd, the problem is DNSSEC and not authoritative availability. That one test is the fastest triage move you have.
For signatures, read the two timestamps in each RRSIG (they print as YYYYMMDDHHmmSS). Expiry arithmetic is where outages hide, so treat the signature validity window as a monitored metric, not a configuration detail.
Why responses get large, and what that breaks
An unsigned A response is roughly 60 to 100 bytes. A signed one adds an RRSIG (about 100 bytes with ECDSA P-256 including name overhead, more with RSA-2048), and a DNSKEY response carrying two keys plus signatures can exceed 1,000 bytes with RSA. Anything beyond a resolver’s advertised EDNS0 buffer size gets truncated or fragmented. The DNS Flag Day 2020 consensus moved the industry toward a default EDNS buffer of 1232 bytes to avoid IP fragmentation. If a middlebox drops fragments or blocks TCP/53 retries, large DNSKEY responses can vanish and validation fails intermittently. The numbers above are arithmetic estimates from typical field sizes, not benchmarks; measure your own zone with dig +bufsize=1232 +dnssec DNSKEY and check the size in the output footer.
This is also why ECDSA beats RSA operationally: smaller DNSKEY RRsets mean fewer TCP fallbacks. It is a recurring theme in cloud DNS design, including the resolver-side behaviours discussed in Kubernetes DNS, CoreDNS and ndots latency, where extra round trips per lookup compound quickly.
Key Rollover: Pre-Publish, Double-Signature and Double-DS
Every key you create will eventually need to be replaced, whether by schedule, algorithm deprecation, staff turnover or compromise. The content of the rollover is mostly waiting: each stage must outlast the caches that hold the previous state. RFC 6781 section 4 defines the methods; the three you need to know are Pre-Publish (ZSK), Double-Signature (ZSK or KSK) and Double-DS (KSK).

Figure 3: Rollover stages. Pre-publish handles the ZSK entirely in your zone; the KSK roll adds a parent DS change and a wait for DS TTL expiry.
ZSK rollover by pre-publish
Pre-Publish is the standard ZSK method and takes four logical stages in the RFC. First, publish the new ZSK in the DNSKEY RRset while continuing to sign with the old one. Second, wait at least the DNSKEY RRset’s TTL plus the propagation time to all authoritative servers, so every resolver cache has seen the new key. Third, switch signing to the new ZSK. Fourth, wait at least the maximum zone TTL plus propagation (so old RRSIGs expire out of caches), then remove the old ZSK.
A worked example makes the timing concrete. Suppose your DNSKEY TTL is 3,600 seconds, your longest record TTL is 86,400 seconds and secondaries take up to 15 minutes to sync. The pre-roll wait is 3,600 plus 900 = 4,500 seconds, about 75 minutes. The post-roll wait is 86,400 plus 900 = 87,300 seconds, about 24 hours 15 minutes. Total elapsed time is just over a day, and any shortcut risks a resolver holding an old signature whose key has already vanished. Shortening TTLs ahead of time is the standard trick for speeding up a planned roll.
Pre-Publish is preferred over Double-Signature for ZSKs because it does not double the number of signatures in the zone. Double-Signature, in which both old and new ZSKs sign everything for a period, uses three stages but inflates response and zone size, which only makes sense for tiny zones or when you can’t predict which keys caches hold.
KSK rollover and the double-DS method
KSK changes involve the parent, so two methods exist. In Double-Signature KSK rollover you add a new KSK, sign the DNSKEY RRset with both KSKs, submit a new DS to the parent, wait for it to appear and for caches to age out the old DS, then remove the old KSK. In Double-DS rollover the order differs: you first have the parent publish DS records for both the old and a new KSK before the new KSK even appears in your zone, then switch which KSK signs, then remove the old DS. RFC 6781 notes that Double-DS needs two parent interactions and leaves a window of “security lameness,” where a DS exists without a matching published key.
The decisive timing term is the old DS’s TTL: after the new DS is live on all parent servers, wait at least the old DS TTL before retiring the old key. Many TLD DS TTLs are on the order of a day, so plan a rollover as a multi-day project, not a maintenance window.
Automating the parent step: CDS and CDNSKEY
The parent step is where human error lives, which is why RFC 7344 defined CDS and CDNSKEY: child-side records that mirror what the child wants its DS to be. A parent that supports it polls the child, validates the CDS RRset against the existing chain, and updates its own DS RRset. RFC 8078 promoted this to Standards Track, added policies for the initial bootstrap (authenticated channel, extra checks, delay, challenge, inception) and defined a delete signal using algorithm 0: CDS 0 0 0 0 or CDNSKEY 0 3 0 0 means “remove the whole DS RRset.” The RFC stresses that disabling DNSSEC weakens security and should be a last resort.
RFC 9615 (July 2024, Standards Track, updating RFC 7344 and 8078) closed the bootstrap gap further. It lets a DNS operator publish authenticated signalling records under a _signal label beneath each of its nameserver hostnames, so a registry or registrar can verify the child’s CDS/CDNSKEY copies and publish the first DS without an unauthenticated “accept after delay.” It cannot bootstrap fully in-domain delegations, where the nameserver sits inside the child zone.
Registry and registrar adoption of CDS scanning varies by TLD; Cloudflare, for instance, documents that it publishes DS automatically for domains registered through Cloudflare Registrar and for .ch and .cz, with a one to two day scan delay and no manual control of timing. Check your own registry’s policy before relying on it.
The root KSK rollover as a live case study
The root zone itself is rolling its KSK. ICANN and Verisign describe the plan as follows: the new key, KSK-2024 (key tag 38696), was first published in the root DNSKEY RRset on 11 January 2025. Resolvers following RFC 5011 observe a new key for 30 days (the add hold-down timer) before adding it to their trust anchors. On 11 October 2026, per ICANN’s announcement, the root zone is scheduled to publish DNSKEY RRsets signed only by KSK-2024, after which any validating resolver without that key fails to validate anything under the root. Verisign’s measurements, using RFC 8145 trust-anchor signalling from a sample of resolvers, show adoption of the new key tracking the 2018 rollover’s pattern and exceeding 95 percent after about 500 days. A residual population still carries only older keys. I have verified these dates and key tag against ICANN’s and Verisign’s own posts; confirm the final post-rollover status with the IANA root-anchors page, because I did not verify the outcome of the 11 October cut-over.
The lesson transfers to every rollover you will run: the data plane cuts over on a TTL clock, but the long tail is resolvers with stale configuration (frozen trust anchors, read-only key directories, containers baked from old images). Verify bind.keys (BIND), root.key (Unbound and PowerDNS Recursor) or root.keys (Knot Resolver) in your own estate, and make sure the process can write to the key store so RFC 5011 updates persist across restarts.
NSEC, NSEC3 and the Zone-Walking Trade-Off
Authenticated denial is the least intuitive part of DNSSEC. When you ask for nothere.example.com, the server cannot present a pre-computed signature for “no such name”, since the set of nonexistent names is infinite. Instead it returns an NSEC record whose owner and “next name” bracket the query in canonical order, signed like any other RRset. The resolver checks that the queried name falls strictly in the gap, and that the type bitmap excludes the queried type for NODATA answers.
The side effect is zone walking. Because each NSEC names its successor, anyone can enumerate the entire zone by following the chain, one query per name, with no brute force. For a public marketing domain this is mostly harmless since the names are already discoverable. For zones where hostnames are semi-sensitive (staging, admin, internal-looking subdomains) it is a reconnaissance gift.
NSEC3 (RFC 5155) hashes the owner names with SHA-1 plus an optional salt and iteration count, and chains the hashes instead. A walker gets hashed labels, not names. The trade-off is weaker than it sounds: an attacker can still collect all hashes by walking, then run offline dictionary attacks against them. Because DNS names are low-entropy (www, mail, vpn, staging) a modest wordlist recovers many labels, and iteration counts barely slow modern GPUs. NSEC3 raises the cost of enumeration; it does not prevent it.
RFC 9276 (BCP 236, August 2022) is blunt about what to do. Section 3.1 says NSEC should be used in preference to NSEC3 if NSEC3’s features are not needed; if you do use NSEC3, set iterations to 0 and use an empty salt, i.e. NSEC3PARAM 1 0 0 -. The RFC calls re-salting “functionally useless” because it forces a full re-sign for no real security gain. It also says opt-out (skipping unsigned delegations in the chain) is not recommended for small zones but may be used for very large, sparsely signed zones such as TLDs.
The reason is computational. Each additional iteration multiplies hash work on both authoritative servers building responses and resolvers verifying them, and attackers can exploit validators with crafted high-iteration zones. RFC 9276 Appendix B, Table 1 reports that 150 iterations cut authoritative query throughput to 38 percent of the 0-iteration rate in the authors’ measurements; treat that as one data point on one setup, not a universal constant. Appendix A reports that treating zones above 100 iterations as insecure was interoperable at publication, and that returning SERVFAIL above 500 iterations also appeared interoperable. Section 4 says resolver operators should set the insecure and SERVFAIL thresholds equal, because a gap between them leaves zones open to on-path attack.
What this means for zone operators
If you adopted NSEC3 with 10, 100 or 500 iterations years ago, some resolvers now answer with SERVFAIL or treat the zone as insecure and attach Extended DNS Error code 27 (“Unsupported NSEC3 Iterations Value”). Lower the iteration count to 0 and drop the salt; the change is a signing-parameter update, not a key roll, but you must re-sign and let the new NSEC3PARAM propagate. Section 3.3 also advises checking secondaries with known nonexistent labels after such a change, since mixed-version secondaries can return inconsistent proofs.
A third option splits the difference: “white lies” (RFC 4470) and the related compact denial of existence approaches, used by providers that sign online. Instead of a precomputed chain, the server fabricates an NSEC that covers only the queried name, computed at query time and signed on the fly. Walking returns nothing useful and no chain is stored. The cost is a signing operation per negative answer and the requirement that private keys be reachable online. This is the pragmatic design behind much of managed DNSSEC. I did not verify the exact denial method each provider uses; check their current documentation.
An adjacent improvement worth enabling on the resolver side is aggressive NSEC caching (RFC 8198), where a validated NSEC range lets the resolver answer subsequent NXDOMAIN queries for names in that range directly from cache. For random-subdomain DDoS attacks against a signed zone, that is a real mitigation, and it works best with NSEC rather than NSEC3 because the ranges are readable.
Managed DNS Providers: What the Documentation Says
Most teams should not run their own signer. Three providers illustrate the design space; I limited the statements below to what I verified in their documentation this run.
Amazon Route 53 signs hosted zones using a customer-managed KSK backed by an AWS KMS key. The key must be asymmetric, in us-east-1, spec ECC_NIST_P256, usable only for signing and verification, with a key policy that grants Route 53 the necessary permissions; each KMS key incurs separate KMS charges. Route 53 allows up to two KSKs per hosted zone, which is exactly what a double-signature KSK rollover needs: add the second KSK, set it Active, update the DS at the registrar, and only then set the old one Inactive and delete it. AWS documents that TTLs in a signed zone are capped at one week, and recommends CloudWatch alarms for DNSSECInternalFailure and DNSSECKeySigningKeysNeedingAction. I did not verify Route 53’s ZSK rotation frequency or its denial-of-existence method from the pages I read, so check “KMS key and ZSK management in Route 53” before documenting either.
Google Cloud DNS states that once DNSSEC is enabled it “automatically manages the creation and rotation of DNSSEC keys” and signs data with RRSIG records. The key operational point: the parent’s DS must exist, and Google’s overview notes that if your registrar cannot add a DS, enabling DNSSEC in Cloud DNS has no effect. It supports migrating DNSSEC-enabled zones while the chain stays intact. Default algorithm, key lengths and NSEC/NSEC3 behaviour were not on the pages I read, so I am not quoting them.
Cloudflare states that enabling DNSSEC makes it sign the zone, publish keys and generate a DS record for you to add at your registrar, with algorithm 13 (ECDSAP256SHA256) as its stated preferred choice. For domains registered through Cloudflare Registrar, plus .ch and .cz, DS publication is automatic via CDS/CDNSKEY scanning. Its documentation also references multi-signer DNSSEC for zero-downtime provider migration when the current provider accepts external DNSKEY records.
Multi-provider and migration pitfalls
The dangerous event with managed DNS is changing provider on a signed zone. If you switch nameservers to a provider that signs with different keys while the old DS stays in the parent, the chain breaks instantly. Safe approaches: (1) remove the DS, wait for its TTL to elapse, migrate, then add the new provider’s DS; (2) use multi-signer, where both providers publish each other’s DNSKEYs in the DNSKEY RRset so either set of signatures validates (RFC 8901 defines multi-signer models); (3) transfer signing keys if both providers allow it. Route 1 costs a window of unsigned operation; routes 2 and 3 need provider support that many do not offer.
DNS reachability also depends on routing: if your authoritative anycast prefixes are hijacked or leaked, signatures will not save you from denial of service. See BGP for cloud engineers: route selection, RPKI and hybrid routing for how RPKI origin validation complements DNSSEC at the routing layer.
Trade-offs, Gotchas, and What Goes Wrong

Figure 4: A triage flow for DNSSEC SERVFAIL. The +cd test separates DNSSEC faults from ordinary authoritative failure; the next branches mirror the most common root causes.
Failure modes cluster into a short list, and nearly all of them are lifecycle errors.
Expired signatures. RRSIGs have absolute validity windows. If your signer stops (a crashed cron job, a revoked credential, a paused pipeline), the zone goes bogus the moment the earliest RRSIG expires, and the time to failure depends on your signing validity period, often days to a few weeks. Monitor the minimum remaining RRSIG lifetime across the zone and page well before it hits a safe floor, such as half your re-sign interval. Large operators have hit this failure too; I am citing the pattern, not a specific postmortem.
DS mismatch. The parent holds a DS that matches no DNSKEY in the child. Causes: provider migration, KSK rotation where the new DS was never submitted, copy-paste errors in the registrar form (wrong algorithm or digest type), or a registrar that publishes the DS but not the algorithm you intended. The outage is total for validating resolvers and invisible from non-validating ones, so ordinary uptime probes may stay green. Probe from a validating resolver and alert on the ad flag disappearing.
Short sign, long cache. Resolvers cache DNSKEY and DS for their TTLs. Deleting a key early produces intermittent failures that follow each resolver’s cache clock, the most confusing symptom to debug.
Clock skew. Signature validation compares timestamps to the resolver’s clock. A resolver, or a signer, with a drifting clock sees good signatures as expired or not yet valid. Use NTP everywhere, and sign with an inception time slightly in the past.
Amplification. DNSSEC raises the amplification factor of DNS reflection attacks because responses are larger; a small query with the DO bit can elicit a response many times its size, especially DNSKEY and NSEC3 negative responses. Mitigate with response rate limiting, a conservative EDNS buffer (1232), and by not offering ANY responses.
Unsupported parameters. High NSEC3 iterations or deprecated algorithms (RSASHA1) cause some validators to treat the zone as insecure or to fail it, as noted above. This is a slow-moving failure that appears after a resolver upgrade rather than after any change you made.
Dependence on the registrar. The weakest link is often the registrar interface: unsupported algorithms, no DS API, or a support process that takes days. Evaluate that before enabling DNSSEC, not after.
Finally, DNSSEC does not fix everything. It does not authenticate the stub-resolver hop, does not encrypt, and does not help if an attacker controls your registrar or signing keys. Treat the KSK as high-value: restrict access, log use, and rehearse a compromise rollover (RFC 6781 section 4.2 covers emergency rollover, with and without keeping the chain intact).
Practical Recommendations
If you operate public zones, enable DNSSEC with a managed provider unless you have a specific reason to run your own signer; the failure modes above are easier to stay ahead of when signing is automated and the provider handles ZSK rotation. Pick algorithm 13 unless your registrar forces otherwise, and prefer the NSEC variant your provider offers by default; if you control the choice and need no privacy from zone walking, plain NSEC is simpler and RFC 9276 prefers it.
Treat DNSSEC as a service with SLOs, not a feature flag. The signal that matters is “does a validating resolver return ad for my critical names,” measured continuously from outside your network, plus the minimum remaining RRSIG lifetime. Exercise your KSK rollover at least once in a controlled window before you need it in anger, because an untested procedure is the most common cause of an emergency outage.
For validating resolvers you run, ensure trust anchors update automatically, the key store is writable, and software is current enough to enforce RFC 9276 limits. Confirm the root key set contains key tag 38696.
- Confirm your registrar supports your chosen DS algorithm and digest type 2 before enabling DNSSEC.
- Verify the DS at the parent matches a live DNSKEY with
diganddnssec-dsfromkeyafter every change. - Alert on RRSIG expiry horizon,
adflag loss, and DNSKEY/DS mismatch from external vantage points. - Set NSEC3 iterations to 0 with an empty salt, or use NSEC.
- Keep DNSKEY TTL short before planned rollovers; restore it afterward.
- Never remove a key until the wait implied by TTL plus propagation has elapsed.
- For provider migrations, use multi-signer or remove the DS first and wait.
- Audit resolver trust anchors for KSK-2024 (tag 38696).
Frequently Asked Questions
What is DNSSEC and what does it protect against?
DNSSEC adds digital signatures to DNS records so a validating resolver can prove an answer came from the zone’s owner and was not altered in transit. It defeats cache poisoning and forged responses by returning SERVFAIL when a signature fails. It does not encrypt DNS traffic, hide query contents or protect the link between a client and its resolver unless that client also validates.
What is a DS record in DNSSEC?
A DS (Delegation Signer) record is stored in the parent zone and contains a digest of the child zone’s key-signing key. It is how trust passes down the hierarchy: a resolver hashes the child’s DNSKEY and compares it with the DS. If the DS is missing the zone is treated as unsigned; if the DS mismatches any DNSKEY, validation fails and the domain becomes unreachable for validating resolvers.
How often should you roll DNSSEC keys?
RFC 6781 suggests about one year for a KSK with a parent DS if you rotate regularly, and about a month for an online ZSK, while noting that any key lifetime must be a multiple of the maximum zone TTL. Managed providers often rotate ZSKs automatically. The more important rule is to rehearse KSK rollovers so an emergency one is not your first.
Should I use NSEC or NSEC3?
Use NSEC unless you specifically need to make zone enumeration harder. RFC 9276 states NSEC should be preferred, and that NSEC3, when needed, should use zero additional iterations and an empty salt. NSEC3 only slows enumeration, since offline dictionary attacks on the hashes remain possible, and extra iterations cost CPU on both authoritative servers and resolvers.
Why does DNSSEC cause outages?
DNSSEC makes DNS correctness depend on time and on agreement between parent and child. The common causes are expired RRSIGs, a DS record that no longer matches the child’s DNSKEY after a provider migration or botched key rollover, unsupported NSEC3 parameters, and resolvers with stale trust anchors. Testing with dig +cd quickly separates DNSSEC failures from ordinary DNS failures.
What is the difference between a KSK and a ZSK?
A ZSK signs the zone’s data RRsets and can be rotated entirely within the zone. A KSK signs only the DNSKEY RRset and is the key referenced by the parent’s DS record, so changing it requires a parent update. Splitting the roles keeps frequent rotation cheap and parent interaction rare, though single-key (CSK) designs are valid when automation handles the parent step.
Further Reading
- DNS anycast, GeoDNS and GSLB failover architecture for how traffic steering interacts with signed answers.
- Kubernetes DNS, CoreDNS and ndots service discovery latency for resolver behaviour inside clusters.
- BGP for cloud engineers: route selection, RPKI and hybrid routing for the routing layer beneath your authoritative servers.
- RFC 9364: DNS Security Extensions (BCP 237), the index of the DNSSEC standards.
- RFC 6781: DNSSEC Operational Practices, Version 2 and RFC 9276: Guidance for NSEC3 Parameter Settings.
- Verisign: 2024-2026 root zone KSK rollover updates and observations.
By Riju — about
