DNSSEC Checker

Check a domain's DNSSEC chain of trust - DS, DNSKEY and RRSIG records, and whether a resolver can validate them end to end.

Looked up live over DNS-over-HTTPS (Cloudflare and Google public resolvers). No data is stored.

Guide

DNSSEC (RFC 4033/4034/4035) adds a chain of digital signatures on top of ordinary DNS, so a resolver can cryptographically prove that the answer it received is the one the zone owner actually published, rather than one forged or altered in transit.

Why plain DNS needed this

Ordinary DNS has no authentication built in. A resolver asks a question, gets an answer over UDP, and has no way to confirm the answer came from the real authoritative server rather than an attacker who guessed the query and raced a forged reply back first - the Kaminsky cache-poisoning class of attack works because nothing in the protocol vouches for a reply beyond a matching transaction ID. DNSSEC closes that gap not by encrypting anything (answers stay just as visible on the wire) but by attaching a signature to each record set, so a resolver can verify authenticity even over an untrusted network path.

That signature has to be checkable without blindly trusting whichever server answered. DNSSEC solves this with a chain of trust that starts at the DNS root and follows the same delegation path plain DNS already uses down to the queried zone - it adds signatures and key records to servers already being asked, not new ones.

  • DNSSEC authenticates DNS answers; it does not encrypt them - anyone can still see the query and response
  • The chain of trust follows the existing delegation path (root → TLD → domain), it does not introduce a separate hierarchy
  • A validating resolver either gets a signature that checks out, or it does not - there is no partial trust
  • A domain with no DNSSEC records at all is simply unsigned, which is the default and not itself an error

DNSKEY, DS, and RRSIG: three records, three jobs

A DNSKEY record holds a zone's public signing key. Most zones publish two: a Zone Signing Key (ZSK) that signs the zone's regular record sets, and a Key Signing Key (KSK) that signs the DNSKEY record set itself - splitting the two lets an operator rotate the ZSK often without touching the KSK, the one the parent zone has to know about. The DNSKEY rdata carries flags (257 marks a KSK via the Secure Entry Point bit, 256 marks a ZSK), a protocol field fixed at 3, an algorithm number, and the public key itself.

A DS (Delegation Signer) record lives in the parent zone, not the child - a hash of the child zone's KSK, published where the parent already holds the child's NS records. This is the actual link in the chain of trust: a resolver that already trusts the parent can fetch the child's DS record, compute the hash of the DNSKEY the child presents, and confirm they match before trusting anything the child zone signs. No DS record at the parent means the chain stops there, even if the child zone itself is fully signed.

An RRSIG record is the signature attached to a signed record set - one RRSIG per record type per zone, covering every record of that type at that name in one signature. Its rdata carries the type it covers, the algorithm and key tag identifying which DNSKEY produced it, expiration and inception timestamps, and the signature bytes themselves. Signatures are time-limited on purpose: a zone keeps re-signing on a rotation schedule, bounding how long a captured signature stays replayable if it ever leaked outside its intended window.

RecordLives whereWhat it proves
DNSKEYIn the signed zone itselfThe public key(s) used to sign that zone's records
DSIn the parent zoneA hash of the child's KSK - the actual link up the chain of trust
RRSIGIn the signed zone, alongside each signed record typeA time-limited signature covering one record type at one name

What the AD flag and chain status actually mean

A validating resolver that successfully checks a zone's entire chain - DS at the parent matching the hash of the child's DNSKEY, RRSIG verifying against that DNSKEY, all the way up to the root - sets the AD (Authenticated Data) bit on its response. That single bit is what most applications actually read: a resolver somewhere in the path did the cryptographic work and the answer passed. A resolver that gets a DS record but cannot complete validation, or that receives records with no signatures at all, does not set AD.

This checker reports three chain states. Secure means the zone is signed and the resolver validated the chain end to end (AD set). Unsigned means no DS or DNSKEY record was found at all - the default state for the large majority of domains, not a fault, just the absence of opt-in. Insecure means the zone carries DNSSEC records but the resolver did not get a validated answer: usually a missing or stale DS record at the parent leaves nothing to authenticate against, and it is also where a genuine validation failure surfaces here. That failure case is what DNSSEC exists to catch - a mismatched key, an expired RRSIG, or a tampered response, which RFC 4033 calls bogus - and a validating resolver is supposed to refuse such an answer outright rather than pass it along as if nothing were wrong.

Algorithm choice affects none of this logic but does affect longevity: RSA/SHA-256 (algorithm 8) remains the most widely deployed, while ECDSA P-256 (algorithm 13) and Ed25519 (algorithm 15) produce far shorter signatures and keys for equivalent security margins, which is why newer deployments increasingly favor them over RSA.

What signing does and does not protect against

DNSSEC's guarantee is narrow: if an answer arrives with AD set, that record set is the one the zone owner actually signed, unmodified in transit. It says nothing about whether the zone owner's content is trustworthy, whether a mail server in an MX record is well-configured, or whether a site behind an A record is safe to visit - separate questions DNSSEC was never designed to answer.

It also hides nothing: query and signed answer both travel in the clear, exactly as unsigned DNS does. Confidentiality is a different problem, addressed by DNS-over-HTTPS or DNS-over-TLS at the transport layer - orthogonal to DNSSEC and commonly deployed alongside it rather than instead of it.

FAQ

What is the actual difference between a KSK and a ZSK?

Both are DNSKEY records, distinguished by their flags field: 257 marks a Key Signing Key (the Secure Entry Point bit is set), 256 marks a Zone Signing Key. The ZSK signs the zone's regular record sets day to day; the KSK's only job is to sign the zone's own DNSKEY record set. Splitting the two lets an operator rotate the ZSK on a short schedule without needing to update the DS record at the parent every time, since only the KSK's hash is published there.

Why does a DS record exist in the parent zone instead of the child?

The DS record is what makes the chain of trust actually chain. A resolver already trusts the parent zone (having walked the delegation down from the root), so a DS record published at the parent - a hash of the child's KSK - lets that trust extend one level down without the resolver having to trust the child zone unconditionally first. If the DS record lived only in the child zone, there would be no independent party vouching for that zone's key, and the signature could not be trusted any more than an unsigned answer.

My domain shows DNSKEY and RRSIG records but the chain status is not secure - why?

That combination almost always means the DS record is missing at the parent (the registrar has not been given it, or it was never submitted after signing was enabled), or the parent has a DS record that no longer matches the current DNSKEY after a key rollover. The zone itself is correctly signed, but nothing links it to the parent's existing trust, so a validating resolver has no basis to authenticate it. This checker reports that as insecure - signed, but chain not validated - rather than secure.

Does enabling DNSSEC make my website load faster or my email more deliverable?

No, not directly. DNSSEC authenticates DNS answers against tampering; it has no effect on page load time, and no major mail provider currently requires DNSSEC as a deliverability signal the way SPF, DKIM, or DMARC are checked. Its value is defending against DNS-level spoofing and cache poisoning, which is a different threat model than performance or mail authentication.

Why does a signature have an expiration date at all?

RRSIG records carry both an inception and an expiration timestamp so that a captured or leaked signature cannot be replayed indefinitely. A zone operator re-signs records on a rotation schedule well before expiry (automated by the DNS software in virtually every real deployment), which bounds the window during which a compromised or stale signature could still validate if it were somehow reused outside its intended lifetime.

Can DNSSEC ever cause a domain to stop resolving entirely?

Yes, this is the most common operational failure mode: if a DS record at the parent is left pointing at a retired key after a rollover, or a zone's signatures expire because re-signing was not automated, validating resolvers will treat every answer for that zone as bogus and refuse to return it, while non-validating resolvers keep working normally. This is why DNSSEC deployments lean heavily on automated signing and rollover rather than manual key management.

Related tools