chaowen. · Notes

Security / DNS infrastructure / trust-anchor operations · 2026-10-13

DNSSEC root KSK rollover: trust anchors are operational state

The DNS root key-signing key (KSK) rollover scheduled for October 11, 2026, is a useful lesson in how cryptographic trust actually works in production. DNSSEC does not merely ask whether a DNS answer has a signature. A validating resolver must begin with a root trust anchor, validate the root DNSKEY set, and follow a chain of signatures downward. If its local anchor state is stale, otherwise healthy domains can fail validation globally.

Two keys, two different jobs

The root zone publishes a DNSKEY set containing a key-signing key (KSK) and a zone-signing key (ZSK). The KSK signs the DNSKEY set; the ZSK signs the root's other records, including delegation data. A resolver's preconfigured root trust anchor authenticates the DNSKEY set, which then supplies the ZSK used to validate the rest of the chain.

local root trust anchor
       │ validates
       ▼
root DNSKEY set ── KSK signs this set
       │ supplies ZSK
       ▼
root records → TLD DS → child DNSKEY → answer

The root has no parent to publish a DS record for it. Its trust anchor is therefore a special starting point. When the root KSK changes, validators need to trust the replacement before it becomes the active signer.

Why publishing a new key is not enough

With RFC 5011 automated rollover, a resolver sees a new key in signed DNSKEY data and tracks it over time. It must observe the key continuously for at least 30 days before accepting it as a trust anchor. That protects against a brief malicious or accidental key insertion. But learned state can be lost when resolver software is upgraded, machines are replaced, state directories are omitted from backups, or a deployment starts from a stale image. A key can have been published for years and still be absent from one resolver's effective trust state.

For the 2026 rollover, KSK-2024 has key tag 38696, replacing KSK-2017 (tag 20326). The critical operational question is not just “does the upstream publish the key?” but “does the resolver that handles these clients currently trust it?”

Reproducible readiness check

RFC 8509 defines a DNS root-key trust-anchor sentinel. A supporting validating resolver answers specially named, correctly signed records differently depending on whether it trusts the queried key. Run these checks against a known resolver with dig:

dig @1.1.1.1 root-key-sentinel-is-ta-38696.dnstest.dev. A +noall +comments +answer
dig @1.1.1.1 root-key-sentinel-not-ta-38696.dnstest.dev. A +noall +comments +answer

For a validating resolver that supports the sentinel, “is trusted” should return a valid response, while “not trusted” should return SERVFAIL. Test an ordinary signed hostname and a deliberately bogus DNSSEC name too: otherwise a timeout, non-validating resolver, or unsupported sentinel can masquerade as a key-status result. An inconclusive result is not evidence that the new anchor is missing.

Lab: distinguish trust failure from ordinary resolution failure

Compare the resolver explicitly, rather than relying on the browser's configured DNS-over-HTTPS path:

# Ask the resolver you intend to test
 dig @RESOLVER root-key-sentinel-is-ta-38696.dnstest.dev. A +dnssec
 dig @RESOLVER root-key-sentinel-not-ta-38696.dnstest.dev. A +dnssec

# Compare with a known public resolver
 dig @1.1.1.1 root-key-sentinel-is-ta-38696.dnstest.dev. A +dnssec

Replace RESOLVER with the recursive resolver's IP. Record resolver version, software package, trust-anchor file or managed state, and whether it supports RFC 8509. Do not blindly copy a key from an unverified source: obtain vendor or IANA instructions, validate the key material, update through the resolver's supported mechanism, and confirm the running process loaded it.

Operational checklist

Takeaway

Cryptographic trust is not only a property of a key; it is also a property of each verifier's stored state, update process, and boot path. Treat trust anchors like critical production data: version the source, preserve runtime state, test the actual verifier, and distinguish “unsupported test” from “key not trusted.”

Primary sources