| # | Flags | Tag | Value | Normalized | Notes | |
|---|---|---|---|---|---|---|
| {{ idx + 1 }} | {{ row.flags }} | {{ row.tag }} | {{ row.value }} | {{ row.normalized }} | {{ row.note || '-' }} |
| # | Check | Status | Notes | |
|---|---|---|---|---|
| {{ idx + 1 }} | {{ c.label }} | {{ c.status }} | {{ c.note || '-' }} |
| # | Flags | Tag | Value | Notes |
|---|---|---|---|---|
| {{ idx + 1 }} | {{ row.flags }} | {{ row.tag }} | {{ row.value }} | {{ row.note || '-' }} |
{{ builderSnippet }}
Certificate Authority Authorization records are a way for a domain owner to state which certificate authorities are allowed to issue certificates for that domain. They help reduce surprise certificates and give you a clear policy signal before you request or renew a certificate for a new service.
You provide a domain name and the tool looks up the published authorization records, then it summarizes what it found and highlights patterns that can cause issuance to fail. It also points out missing best practices so you can tighten rules with confidence and document what you intended clearly.
A realistic use is an operations review before a migration where you want to ensure only your chosen certificate authority can issue for the new hostnames. If a record uses a critical flag with an unfamiliar tag, the tool warns that some issuers may refuse to proceed.
Treat the result as a policy check, not proof that a certificate exists or that an account is active, and avoid testing private internal domains if you do not want a third party resolver to see them.
Certificate Authority Authorization (CAA) is a Domain Name System (DNS) record type that lets a domain publish certificate issuance permissions as a set of simple rule rows. Each row has an integer flags field, a tag that names the rule, and a value that carries an issuer domain, a reporting address, or parameters.
This validator measures what is published for the hostname you enter, then computes a normalized view so logically identical rows compare cleanly. It also evaluates a small set of safety checks and reports them as PASS, WARN, or FAIL to help you spot misconfigurations quickly.
The checks focus on outcomes that matter operationally, such as whether you have any issuer restrictions, whether wildcard issuance is explicitly controlled, and whether a critical flag is paired with an unknown tag. Values for issue and issuewild are normalized by lowercasing and sorting semicolon parameters, and iodef is checked for basic Uniform Resource Identifier (URI) syntax for mailto and https schemes.
Results are best read as a policy health signal rather than a guarantee of issuance. Different resolvers can return different answer sets during propagation, so recheck after changes and compare using the same resolver when you want like for like results.
A row is treated as critical when bit 128 is set in the flags field. Unknown critical tags are highlighted because they can block issuance in some implementations.
| Symbol | Meaning | Unit or datatype | Source |
|---|---|---|---|
d |
Input hostname after extraction | string | Input |
d_ascii |
ASCII form of the hostname | string | Derived |
f |
CAA flags field | integer | Derived |
t |
CAA tag, lowercased | string | Derived |
v |
Raw CAA value after quote cleanup | string | Derived |
v_norm |
Normalized value used for comparisons | string | Derived |
TTL |
Time to Live reported by the resolver | seconds | Resolver |
T_query |
Measured lookup duration | milliseconds | Derived |
S |
Check status value | PASS, WARN, FAIL | Derived |
Suppose you paste https://Example.COM/login. The hostname extracted is example.com, then the DoH response returns these CAA answer rows.
0 issue "letsencrypt.org; ParamB=2; ParamA=1"
0 issuewild ";"
0 iodef "mailto:security@example.com"
128 unknown "value"
Normalization turns the first value into letsencrypt.org; parama=1; paramb=2, and the deny all issuewild row is labeled as a deny all directive.
The critical flag check is a bit test against 128.
Lookup time is rounded to the nearest whole millisecond.
In this example the unknown tag is marked as a FAIL because it is paired with a critical flag, while the iodef mailto value passes the basic syntax check.
| Status | What it indicates | Suggested next step |
|---|---|---|
| PASS | The check found no immediate risk for the specific rule being tested. | Keep as is, and recheck after DNS changes propagate. |
| WARN | A best practice is missing or a duplicate is present after normalization. | Review for clarity and intent, then tighten if appropriate. |
| FAIL | A configuration may block issuance or carries an unsafe ambiguity. | Fix before requesting a certificate from a public issuer. |
When values sit close to a decision boundary, treat WARN as a prompt to confirm intent rather than an error. Always resolve FAIL first because it can stop issuance entirely.
| Parameter | Meaning | Unit or datatype | Typical range | Sensitivity | Notes |
|---|---|---|---|---|---|
| Resolver | Which DoH provider is queried for the record set | enum | Auto, Cloudflare, Google | Medium | Auto falls back only when the first request fails to fetch. |
| Timeout | Abort a single DoH request after this duration | milliseconds | 0 to many | High | 0 applies no extra abort timer beyond normal network behavior. |
| Builder preset | Suggested issuers used when drafting new CAA rows | enum | 4 presets | High | Presets include Let's Encrypt, DigiCert, Google Trust Services, and Mixed. |
| Include issuewild | Whether the builder also drafts wildcard issuance rules | boolean | true or false | High | When omitted, wildcard behavior is left to issuer defaults. |
| Add deny all rows | Whether the builder adds value ; to explicitly deny issuance |
boolean | true or false | High | Adding both deny and allow rows can create conflicts. |
| iodef URI | Optional incident reporting address added to builder output | string | mailto or https | Low | Only basic syntax is checked when validating queried records. |
| Constant | Value | Unit | Source | Notes |
|---|---|---|---|---|
| Known tags | issue, issuewild, iodef |
set | Constant | Unknown tags are flagged, and unknown critical tags are treated as failures. |
| Cloudflare DoH endpoint | https://cloudflare-dns.com/dns-query |
URL | Constant | Used when the resolver is Cloudflare or Auto. |
| Google DoH endpoint | https://dns.google/resolve |
URL | Constant | Used when the resolver is Google or as an Auto fallback. |
| Builder TTL | 3600 |
seconds | Constant | Used only in the zone snippet template, not read from your DNS. |
| Preset issuers |
|
domains | Constant | Issuer domains are normalized to lowercase and stripped of a trailing dot. |
flags & 128.; .| Field | Type | Min | Max | Step or pattern | Error text | Placeholder |
|---|---|---|---|---|---|---|
| Domain input | string | 1 | n | Accepts domain, URL, email, or mailto prefix, then extracts the hostname | Domain is required. |
example.com |
| Resolver | enum | — | — | auto, cloudflare, google |
— | — |
| Timeout | number | 0 | — | step=100 |
— | 3500 |
| CAA answer row | string | — | — | ^\\s*(\\d+)\\s+([A-Za-z0-9-]+)\\s+(.*)\\s*$ |
Malformed row |
— |
| iodef value | string | 1 | n | mailto: with @ or a valid https: URL |
Invalid mailto URI, Invalid https URL, iodef must use https |
mailto:security@example.com |
| Input | Accepted families | Output | Encoding or precision | Rounding |
|---|---|---|---|---|
| Domain string | Hostname, URL, email address | CAA record rows with normalized view | text | Not applicable |
| DoH response | JSON answer array | Checks list with status and notes | text | Not applicable |
| Builder options | Preset selection and toggles | Zone snippet lines like example.com. 3600 IN CAA 0 issue "issuer" |
text | Not applicable |
| Exports | Generated files and clipboard text | CSV tables, DOCX reports, and a JSON summary | JSON uses 2 space indentation | Query time rounded |
Lookups are performed with fetch requests to the selected DoH endpoint, using an accept header of application/dns-json and a query that sets name, type=CAA, and ct=application/dns-json. The page keeps results in memory while you view them and resets state on each new validation run.
For n answer rows, parsing, normalization, and duplicate detection run in O(n) time with O(n) memory for the dedupe set. Given the same resolver response, the normalized record list and check outcomes are deterministic, but the resolver response itself can differ across providers and time.
issue, issuewild, and iodef as known tags.issue, not for issuewild.0 and does not attempt to set the critical flag.@ as the hostname.Authoritative references include the IETF specification for Certificate Authority Authorization, the IETF specification for DNS over HTTPS, and the IANA registry of DNS record types.
Lookup requests are sent from your browser directly to the selected resolver endpoint, and the page does not persist results to local or session storage.
Certificate Authority Authorization records tell you which issuers are permitted, and this guide walks you from a domain input to a clear PASS WARN FAIL summary you can act on.
Example You enter mail@example.com and the hostname extracted is example.com. The result shows 2 records, 1 pass, 1 warn, and a TTL value from the resolver.
If the warn is about a missing issuewild policy, add an explicit wildcard rule when you want wildcard issuance constrained.
Pro tip: when debugging, run the same domain through two resolvers back to back and compare normalized values rather than raw text.
You should finish with a normalized record list and a small checklist you can use to update DNS confidently.
issue ";" with permissive issue rows in the same set.The page keeps results in memory for display and export and does not write them to local or session storage. DNS lookups are sent to the selected resolver endpoint.
Accuracy depends on what the resolver returns at that moment and how caches and propagation behave. Compare using the same resolver when you want consistent snapshots.Treat TTL as a hint, since only the first answer TTL is shown.
Inputs accept a hostname, a URL, an email address, or a mailto prefix, and the hostname is extracted. Outputs include tables of records and checks, a builder snippet, and a JSON summary.
Record validation requires network access because it queries a DNS over HTTPS resolver. Builder output is generated locally from the preset and your inputs once the page is loaded.
This package does not display pricing or subscription details. If you need licensing information, follow the policy of the site that provides this page.
A certificate signing request is not validated here. This utility checks CAA DNS records and drafts CAA rule rows, so use a dedicated CSR parser for request inspection.
WARN is the borderline case, and it usually means a best practice is missing, a duplicate exists after normalization, or a policy choice is not explicit. FAIL signals a stronger risk that can block issuance.