DNS

DNS health report

See DNSSEC, CAA and the nameservers for one domain together, with the fixes in the order to do them.

Free, no accountLive check

Try

Result

The verdict appears here once you press Run the report.

What this is

This dns health report runs the DNSSEC chain, CAA and nameserver checks for one domain together, and orders what it finds the way it actually needs fixing: a broken chain of trust and a locked-out certificate authority before the plainer notes about who serves the zone.

Three separate questions sit behind "is this domain's DNS healthy": does its signed chain of trust actually hold, which certificate authorities is it willing to let issue for it, and who is actually delegated to answer for it at all. None of the three tells the others apart - a domain can sign its records perfectly and still leave every CA free to issue, or lock issuance down to one CA while its own DNSSEC chain quietly does not match the key it published.

Checking the three apart means visiting three pages and holding the result of each in your head at once. This report runs all three against the one domain typed in, and reads the three results back as a single plain sentence before it gets into the detail underneath.

How to read the result

The table at the top gives DNSSEC, CAA and the nameservers one word each. "Fixes, in the order to do them" underneath turns every problem found into a numbered list: a broken DNSSEC chain or an issuance lockout comes before a plain note about how many nameservers were found, since the first two can actively break something and the third usually cannot.

Every finding keeps the detail its own check would give - the exact RFC section it cites, the record to change - with the check it came from named in front of it, so nothing here is thinner than visiting that check on its own would be.

Common mistakes

What goes wrong most often, and how to tell.

  • Treating a clean DNSSEC chain as proof the rest of the domain is fine tooA domain can sign its own records correctly and still publish no CAA record at all, or run on a single nameserver with nothing backing it up. Each of these three is its own, separate risk, and a pass on one says nothing about either of the other two.
  • Reading "no DNSSEC" and "no CAA" as the same kind of gapNeither is automatically a fault - most of the internet runs unsigned and with no CAA record at all - but they fail very differently when something does go wrong. An unsigned domain can be spoofed by a forged answer; one with no CAA record simply lets any public CA issue for it, which most domains have always allowed.
  • Running this once after setup and never againA key rollover can leave a stale DS record behind, a CAA record can be added by one team and forgotten by another, and a nameserver migration can land half-finished. None of the three checks this report runs describe something that, once correct, stays correct forever.

Questions

What people ask about this tool.

  • Because none of the three answers the others: a domain can have a perfectly signed DNSSEC chain and still allow any certificate authority to issue for it, or lock issuance down to one CA while running on a single nameserver with no second path if it goes down. Checking them together is the only way to see all three risks for one domain at a glance.
  • Nothing less than its own page: it recomputes the same DS digest from the same DNSKEY bytes and shows the same per-resolver authenticated-data flag, never claiming to have verified a signature itself, since no DNS-over-HTTPS JSON API hands one back to check directly. This page just adds CAA and the nameservers alongside it in one pass.
  • Not on its own. It means no restriction has ever been set, so any publicly trusted certificate authority remains free to issue for that name, which is the default most domains have always been in. It only becomes worth fixing if you specifically want to restrict issuance to a CA you actually use.
  • Both: it reads the registry’s own RDAP nameserver list the same way the nameserver and DNS host checker does, and warns when that list no longer matches what the zone itself answers - the gap a nameserver change left half applied leaves behind. Matching a hostname to a likely host uses the same pattern list as that page too.

Sources

Every fixed value here comes from the provider’s own documentation. These pages change, so each says the day it was last read.

Use it from the API

The same check, as one request.

Request
curl -X POST https://resellerhq.com/api/tools/dns-health-report \
  -H "Content-Type: application/json" \
  -d '{"domain":"secure.example"}'
Response
{
  "tool": "dns-health-report",
  "input": {
    "domain": "secure.example"
  },
  "result": {
    "verdict": {
      "tone": "success",
      "headline": "DNS health for secure.example looks sound",
      "summary": "DNSSEC looks sound, CAA looks sound, and the nameserver check looks sound."
    },
    "findings": [
      {
        "id": "ns-registry-list-unavailable",
        "severity": "info",
        "title": "Nameservers: Registry did not publish a nameserver list",
        "detail": "RDAP for secure.example came back with no usable nameserver list, so the zone’s own NS answer above could not be checked against what the registry has on file."
      },
      {
        "id": "dnssec-ds-digest-verified",
        "severity": "pass",
        "title": "DNSSEC: The DS record matches the published DNSKEY",
        "detail": "Hashing the DNSKEY's own bytes the way RFC 4034 §5.1.4 defines reproduces exactly the digest secure.example's DS record states, so this link in the chain was recomputed independently rather than taken on trust."
      },
      {
        "id": "dnssec-resolvers-agree-authenticated",
        "severity": "pass",
        "title": "DNSSEC: Both resolvers say this chain validates",
        "detail": "Every resolver this report asked (Cloudflare, Google) set its own authenticated-data flag on this answer - a strong second signal, never a signature this report checked itself, since no DNS-over-HTTPS JSON API hands one back to verify directly."
      },
      {
        "id": "caa-caa-found",
        "severity": "pass",
        "title": "CAA: A CAA record is published at secure.example",
        "detail": "secure.example publishes 1 CAA record, so issuance here is restricted rather than left open to any CA."
      },
      {
        "id": "ns-ns-published",
        "severity": "pass",
        "title": "Nameservers: 2 nameservers published",
        "detail": "secure.example delegates to ns1.cloudflare.com, ns2.cloudflare.com."
      },
      {
        "id": "ns-host-identified",
        "severity": "pass",
        "title": "Nameservers: Hosted on Cloudflare",
        "detail": "Every nameserver secure.example publishes matches the hostname pattern Cloudflare uses for its customers."
      }
    ],
    "parts": [
      {
        "kind": "table",
        "title": "Every check, at a glance",
        "columns": [
          "Check",
          "Result"
        ],
        "rows": [
          [
            "DNSSEC",
            "looks sound"
          ],
          [
            "CAA",
            "looks sound"
          ],
          [
            "Nameservers",
            "looks sound"
          ]
        ]
      }
    ],
    "lookups": [
      {
        "label": "DS for secure.example via Cloudflare",
        "value": "6391 8 2 59944F3953F16AEEA8501D756C654F9786748CC2F6F594029D3826FF0E3F7507"
      },
      {
        "label": "DS for secure.example via Google",
        "value": "6391 8 2 59944F3953F16AEEA8501D756C654F9786748CC2F6F594029D3826FF0E3F7507"
      },
      {
        "label": "DNSKEY for secure.example via Cloudflare",
        "value": "257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICVnScbtmc6k8jjPOF+c9SfbzcKAiMOA6vaoaY5Y4NCycnoIR3eF+2kPCwI46AbL/XYcY6bSk6jvIcHjbTuvtfcXpdqAWh/0K/RHBeJsNlw3xRlcpMiDWiAqLmKrNZJ2yYcO06iT0BE= (ad=yes)"
      },
      {
        "label": "DNSKEY for secure.example via Google",
        "value": "257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICVnScbtmc6k8jjPOF+c9SfbzcKAiMOA6vaoaY5Y4NCycnoIR3eF+2kPCwI46AbL/XYcY6bSk6jvIcHjbTuvtfcXpdqAWh/0K/RHBeJsNlw3xRlcpMiDWiAqLmKrNZJ2yYcO06iT0BE= (ad=yes)"
      },
      {
        "label": "CAA for secure.example",
        "value": "0 issue \"letsencrypt.org\""
      },
      {
        "label": "NS for secure.example",
        "value": "ok: ns1.cloudflare.com., ns2.cloudflare.com."
      },
      {
        "label": "RDAP nameservers for secure.example",
        "value": "none published"
      }
    ],
    "limits": [
      "This report is only as complete as the three checks it runs: it recomputes a DS digest and shows each resolver’s own authenticated-data flag, but it never verifies a DNSSEC signature itself, since no DNS-over-HTTPS JSON API hands one back to check; it reads CAA as published, not as intended; and it names a DNS host from a hostname pattern, which is a strong hint rather than something the provider published itself."
    ]
  }
}

This example uses a name RFC 2606 reserves for documentation, ending in .example, .test, .invalid or .localhost. None of them is a real domain, and nobody can register one.

Resell the domains these records point at, at your own price, under your own brand.

Get started

Company names and logos are trademarks of their owners, shown only to identify each service.