CAA Records Explained: Certification Authority Authorization (RFC 8659), Property Tags, and DNS Issuance Control
Everything a domain owner needs to publish, validate, and audit CAA records — from the DNS RDATA format (flags / tag / value) to the property-tag catalogue (issue / issuewild / iodef) and the CA identifier registry — with worked examples for single-CA allow-lists, parked-domain forbid, ACME validation-method restriction, and sub-domain overrides.
This reference is provided in English. CAA is specified in English-language RFCs (RFC 8659, RFC 8657) and the canonical syntax (issue / issuewild / iodef, CA identifier values, the empty-issue ";" marker) does not translate. We keep the body in the source language so technical terms remain consistent with the specifications.
TL;DR
- CAA (Certification Authority Authorization) is the DNS record that controls which CAs may issue TLS / SSL certificates for a domain. Defined in RFC 8659 (obsoletes RFC 6844).
- CAA records have three fields:
flags(integer;128marks the record critical),tag(issue,issuewild, oriodef), andvalue(a quoted string — CA identifier forissue/issuewild; URI foriodef). - CAA is mandatory under the CA/Browser Forum Baseline Requirements: a public CA that finds a CAA record naming a different issuer MUST refuse to sign the certificate. Enforcement is at issuance time.
- An empty-issue value (
0 issue ";") explicitly forbids ALL CAs from issuing — the canonical pattern for parked or unused domains. - CAs perform a tree-walking lookup: they check the requested name, then walk up one label at a time until they find CAA records or hit a Top Level Domain. A record at the apex governs all sub-domains unless a more-specific record overrides it.
- CAA is an issuance-time control, not a runtime check. Removing a CAA record after a certificate has been issued does NOT revoke that certificate. CAA only controls future issuances.
1. What is a CAA record?
CAA (Certification Authority Authorization) is a DNS-based mechanism that lets a domain owner declare which Certificate Authorities are authorised to issue TLS / SSL certificates for the domain. CAA is specified in RFC 8659 — DNS Certification Authority Authorization (CAA) Resource Record, which obsoletes the original RFC 6844.
Before CAA, any publicly-trusted CA could issue a certificate for any domain — the only thing stopping mis-issuance was the CA's domain-validation procedure. CAA inverts that posture: domain owners publish a DNS record naming the CAs they trust, and every publicly-trusted CA is required (by the CA/Browser Forum Baseline Requirements §3.2.2.8) to check that record before signing a certificate. A CA that finds a CAA record naming a different issuer MUST refuse the request — even if the requester passed domain-validation.
CAA is an issuance-time control, not a runtime control. The CAA check happens once when the CA is preparing to sign the certificate; after that, the certificate is valid for its declared lifetime regardless of any later CAA changes. To revoke a certificate, the domain owner must contact the issuing CA's revocation process — removing the CAA record is not enough.
Like other DNS-security records on this site (SPF, DKIM, MTA-STS), CAA is a publish-once-and-monitor control: write the record, then audit changes. It complements rather than replaces the existing PKI trust model.
2. How CAA works, step by step
- The domain owner publishes one or more CAA
DNS records naming the CAs they trust. A
typical apex record looks like
example.com. IN CAA 0 issue "letsencrypt.org". - When a CA receives a certificate-signing
request for
foo.bar.example.com, it performs the CAA tree-walking algorithm (RFC 8659 §3): queryfoo.bar.example.comfor CAA records; if none, querybar.example.com; if none, queryexample.com; continue until CAA records are found or the parent is a TLD (com). The closest set of CAA records wins. - The CA inspects the matched CAA records. If
any
issue(orissuewildfor a wildcard request) record names the CA's identifier string, issuance is authorised. If ANY CAA record exists but none authorise the CA, issuance is REFUSED — even if the requester passed domain-validation. - If the matched records include an
iodeftag, the CA SHOULD report every blocked-issuance attempt to the URI declared (typically a mailto: or https: endpoint). This is the operational feedback loop that lets domain owners detect attempted unauthorised issuance. - The CA records the CAA lookup details in its audit log (required by the CA/Browser Forum Baseline Requirements) and proceeds with issuance or refusal.
- The published certificate is then valid for its full lifetime (typically 90 days for Let's Encrypt, 1 year for paid CAs) regardless of any later CAA changes.
3. CAA DNS syntax
A CAA record has three fields in the RDATA portion: flags, tag, and value.
example.com. IN CAA 0 issue "letsencrypt.org"
^ ^ ^ ^ ^
| | | | +-- value (quoted string)
| | | +-------- tag (issue | issuewild | iodef)
| | +---------- flags (integer, 0 or 128)
| +-------------- record type (CAA)
+------------------ class (IN)
Field-by-field anatomy:
flags- Integer 0-255. Bit 7 (decimal
128) is the critical flag — when set, a CA that does not understand thetagMUST refuse to issue. All other bits are reserved. For the three currently-defined tags (issue,issuewild,iodef), every conforming CA understands them, so critical is rarely needed; the default0is correct in almost all cases. tag- Lowercase property tag. RFC 8659 defines three:
issue(authorise a CA to issue non-wildcard certificates),issuewild(authorise a CA to issue wildcard certificates), andiodef(declare a contact URI for violation reports). Additional tags are registered with IANA; current registrations includecontactemailandcontactphonefrom RFC 8657. value- Quoted string. For
issueandissuewild, the value is a CA identifier — typically the CA's primary domain name (letsencrypt.org,digicert.com,sectigo.com). Foriodef, the value is a URI (mailto:orhttps:). An empty value (";") on anissue/issuewildtag means "no CA authorised" — the canonical explicit-forbid pattern.
Multiple CAA records at the same name are
additive: the union of their authorisations
applies. To allow Let's Encrypt AND DigiCert,
publish two issue records — one for
each.
Optional CA-specific value parameters
can appear after the identifier, separated by
semicolons. For example,
0 issue "letsencrypt.org; validationmethods=http-01"
restricts Let's Encrypt to a specific challenge
type. Parameter support varies by CA; check the
CA's documentation for the full list.
5. CA identifier values
The CA identifier string in a CAA
issue record is defined by each CA
individually — there is no IANA registry of
canonical identifiers. CAs publish their accepted
identifier in their documentation. Common values
for major publicly-trusted CAs:
| CA | CAA identifier | Notes |
|---|---|---|
| Let's Encrypt | "letsencrypt.org" |
Free, automated, 90-day certificates.
Supports ACME challenge restriction
via validationmethods=
parameter. |
| DigiCert | "digicert.com" |
Commercial CA. Also issues Verified Mark Certificates (VMCs) for BIMI. |
| Sectigo (formerly Comodo) | "sectigo.com" |
Commercial CA. Wide reseller channel (Namecheap, etc.). |
| GlobalSign | "globalsign.com" |
Commercial CA with strong EU presence. |
| GoDaddy | "godaddy.com" |
Registrar-bundled certificates. |
| Entrust | "entrust.net" |
Commercial CA. Also issues VMCs for BIMI. |
| Google Trust Services | "pki.goog" |
Free ACME-based CA. Used heavily by Google Cloud / Workspace. |
| Amazon | "amazon.com" /
"amazontrust.com" |
AWS Certificate Manager (ACM). Each AWS region uses a slightly different identifier — check AWS docs for the current list. |
| BuyPass | "buypass.com" |
Free ACME CA, EU-based. |
| SSL.com | "ssl.com" |
Commercial CA. |
Always check the issuing CA's current documentation for the exact identifier before publishing — a typo or stale value silently blocks issuance until corrected. For private/internal CAs, the operator chooses the identifier and configures their CA to recognise it.
6. CAA examples
6.1 Single-CA authorisation (Let's Encrypt only)
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 iodef "mailto:security@example.com"
The most common production shape: one
issue record naming the active CA,
plus an iodef record so the security
team gets notified of any blocked-issuance
attempts. Wildcard certificates from Let's Encrypt
are also authorised because no
issuewild override exists.
6.2 Multi-CA allow-list
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 issue "digicert.com"
example.com. IN CAA 0 iodef "mailto:security@example.com"
Authorises Let's Encrypt (typical Web servers) AND
DigiCert (for VMC / EV / paid certificate
workflows). Multiple issue records at
the same name are unioned together.
6.3 Block wildcard issuance
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 issuewild ";"
Authorises Let's Encrypt for normal hostnames but explicitly forbids wildcard certificates from any CA. Useful for domains where each sub-domain should have its own certificate (smaller blast radius if any single private key is compromised).
6.4 Explicit "no certificates" — parked domain
example.com. IN CAA 0 issue ";"
example.com. IN CAA 0 issuewild ";"
example.com. IN CAA 0 iodef "mailto:security@example.com"
A parked or sale-only domain that should never
have a certificate. Every CA is explicitly
forbidden; the iodef record alerts
the operator if someone attempts to issue one
(often a sign of attempted impersonation or domain
takeover).
6.5 ACME-only restriction
example.com. IN CAA 0 issue "letsencrypt.org; validationmethods=dns-01"
Authorises Let's Encrypt only for the DNS-01 challenge — HTTP-01 and TLS-ALPN-01 are forbidden by this restriction. Useful when the operator centralises certificate issuance through their DNS provider and wants to prevent compromise of individual Web servers from being usable to obtain a certificate.
6.6 Sub-domain override
example.com. IN CAA 0 issue "letsencrypt.org"
mta-sts.example.com. IN CAA 0 issue "digicert.com"
The apex authorises Let's Encrypt for most
sub-domains, but
mta-sts.example.com uses DigiCert
(perhaps because that host serves an
MTA-STS
policy requiring a longer-lifetime certificate,
or because organisational policy mandates an EV
cert there). The more-specific record wins per
the RFC 8659 tree-walking rule.
6.7 IODEF reporting via HTTPS endpoint
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 iodef "https://reports.example.com/iodef"
The HTTPS variant of iodef: blocked-
issuance reports get POSTed to the URL as JSON.
The endpoint should accept
Content-Type: application/json and
parse RFC 7970 IODEF documents.
7. CAA best practices
- Publish a CAA record on every active
domain you own. A domain with no CAA
record permits any publicly-trusted CA to
issue — the default-open posture is the
weakest one. Even a single
0 issue "letsencrypt.org"record meaningfully tightens the issuance attack surface. - Always include an
iodefURI. Without it, attempted unauthorised issuances are silent — you only learn about them after the fact (if ever). Amailto:security@example.comcontact takes 30 seconds to add and gives you live attack telemetry. - Use a small allow-list, not a single
CA. The strictness of
0 issue "letsencrypt.org"alone bites the day Let's Encrypt has an outage or you migrate. Authorising 2-3 backup CAs (DigiCert, Sectigo, or Google) keeps operations flexible. - Audit CAA before deploying MTA-STS
and BIMI. Both standards require
public-PKI certificates on dedicated hosts
(
mta-sts.<domain>,bimi.<domain>); a CAA record that doesn't authorise the issuing CA silently blocks deployment. See help_mta_sts_explained.php and help_bimi_explained.php. - Pair CAA with DNSSEC. Without DNSSEC, a network attacker can spoof empty CAA responses to the CA and trick it into issuing. With DNSSEC, the response is cryptographically signed end-to-end. DNSSEC is not yet required by the CA/Browser Forum but is best-practice.
- Block wildcard issuance for
high-value domains.
0 issuewild ";"reduces blast radius — a compromised wildcard cert covers every sub-domain at once; per-host certificates limit damage. - Use ACME validation-method
restrictions for centralised cert
management.
validationmethods=dns-01guarantees issuance can only happen through the operator's DNS automation, blocking per-host issuance attempts from compromised Web servers. - Set TTL low during CAA changes. A 300-second TTL during a CA migration lets you roll back quickly if issuance breaks. Bump TTL back to 3600+ once the migration stabilises.
- Test CAA before relying on it.
Use
dig CAA <domain>or SSLMate's CAA testing tool before attempting actual certificate issuance. DMARC Analyzer's Domain Security Checker also reports the current CAA records and flags missing-CAA as a security finding. - Document CAA changes in your runbook. A CAA record change blocks future issuance — renewal cron jobs that started succeeding will suddenly fail. Record every change with a date + rationale so your future self can diagnose certificate-renewal incidents.
8. Common CAA mistakes
- Typo in the CA identifier.
"lets-encrypt.org","letsencrypt.com", or"letsencrypt"all silently block Let's Encrypt issuance. The canonical value is"letsencrypt.org"with no hyphen and the.orgTLD. Always copy from the CA's documentation. - Missing the
issuewildrecord. Operators sometimes publish0 issue "letsencrypt.org"and assume that blocks wildcard issuance from other CAs. It doesn't — wildcards from Let's Encrypt are still authorised by theissuetag in the absence of an explicitissuewildoverride. To block wildcards, publish0 issuewild ";". - Forgetting to update CAA before a CA migration. Switching from DigiCert to Let's Encrypt and updating only the renewal automation produces a green ACME validation result followed by a CAA refusal — the cert never gets issued. Update CAA FIRST, wait for DNS propagation, then migrate.
- Stripping CAA records when an old
CA is deprecated. Removing
0 issue "digicert.com"works, but the change does NOT revoke existing DigiCert certificates — those remain valid until theirnotAfterdate. Revocation is a separate process via the CA. - Mixing flags 0 and 128 without
reason. The critical flag (128)
forces refusal on unknown tags. The three
defined tags (
issue,issuewild,iodef) are universally understood, so the critical flag almost never adds value — use0and reserve128for genuinely-new extensions. - Using
http://for theiodefURI. Plain HTTP endpoints accept reports but are unauthenticated and can be tampered with. Usehttps://ormailto:. - Publishing
CNAMEfor themta-stshost that points to a CDN with a different CAA-authorised CA. Cross-CA / cross-CDN setups need the apex CAA record to authorise whatever CA the CDN provider actually uses. Audit the chain explicitly. - Treating CAA as runtime enforcement. CAA only gates new issuances. A previously-issued certificate remains valid until it expires regardless of any later CAA change. The "removed-CAA- record-revokes-cert" assumption is wrong.
- Publishing CAA records at every sub-domain redundantly. CAA tree-walks, so a single apex record covers every sub-domain unless overridden. Don't copy-paste the same record across 50 sub-domains; publish it once at the apex.
9. CAA troubleshooting
- Certificate issuance is failing with "CAA refusal" or similar
- Look at the CA's error message for the exact
identifier it queried. Check that one of your
published
issuerecords exactly matches that string (dig CAA <domain>). Common cause: a typo or a stale record left over from a prior CA. Fix the record and wait at least the published TTL before retrying. dig CAA <domain>returns nothing but my DNS provider's UI shows the record- Some DNS providers attach CAA records to
sub-domains that don't actually answer
authoritatively, or split the response across
cache views. Test against multiple resolvers
(
+trace,1.1.1.1,8.8.8.8) and confirm the authoritative server returns the record directly. - Wildcard issuance is failing but non-wildcard works
- Check for an
issuewildrecord that doesn't authorise the CA — if present, it takes precedence overissuefor wildcards. Either add anissuewildfor the desired CA or remove the conflicting one. - I'm getting
iodefreports for attempted issuance I didn't initiate - This is exactly what
iodefis for — investigate immediately. Common causes: a forgotten automated renewal job on a decommissioned host, a CA migration test from a colleague, OR an actual attempted impersonation (escalate to the security team). - My CAA record looks correct but the CA still refuses
- CAs cache CAA responses for the published DNS
TTL. If you updated the record recently, the
CA may still see the previous value. Confirm
the live record with
dig CAA <domain>, wait for the previous TTL to expire, and retry. Cloudflare's1.1.1.1is a good no-cache test resolver. - How do I see CAA records for an arbitrary domain?
- Use
dig CAA example.com +shortfrom any moderndiginstall (BIND 9.9.6+, RFC-compliant resolvers). DMARC Analyzer's Domain Security Checker also displays CAA records inline alongside SPF / DKIM / DMARC findings. - Does removing a CAA record revoke existing certificates?
- No. CAA is only checked at issuance time; existing certificates remain valid for their full lifetime. To revoke a certificate, contact the issuing CA's revocation API or portal directly.
10. Frequently Asked Questions
- What is a CAA record?
- A CAA (Certification Authority Authorization) record is a DNS record that lets a domain owner declare which Certificate Authorities are authorised to issue TLS / SSL certificates for the domain. Defined in RFC 8659 (which obsoletes RFC 6844), CAA records are mandatory to check before issuance under the CA/Browser Forum Baseline Requirements: a CA that finds a CAA record naming a different issuer MUST refuse to sign the certificate. CAA is a defense against accidental or malicious mis-issuance.
- What does a CAA DNS record look like?
- A CAA record is a DNS record with three
fields:
flags(an integer, typically0;128marks the record critical),tag(one ofissue,issuewild, oriodef), andvalue(a quoted string — the CA identifier forissue/issuewild, a contact URI foriodef). A typical record is:example.com. IN CAA 0 issue "letsencrypt.org"— authorising Let's Encrypt to issue certificates forexample.com. - What is the difference between issue, issuewild, and iodef?
issueauthorises a CA to issue certificates for the exact domain (and, by default, wildcard certificates unless anissuewildrecord overrides it).issuewildauthorises a CA to issue wildcard certificates (*.example.com); when present, it takes precedence overissuefor wildcard requests.iodefdeclares a contact URI (typicallymailto:orhttps:) where CAs should report attempted policy violations.iodefis informational;issueandissuewildare enforcement records.- What is the empty-issue value ";"?
- An
issuevalue of";"(just a semicolon) is the explicit "no CAs authorised" marker. Publishing0 issue ";"tells every CA that NO issuer may certify the domain — useful for unused or parked domains that should never have certificates. Combined with a small allow-list, the pattern "0 issue "letsencrypt.org"; 0 issue ";"" means only Let's Encrypt is authorised; every other CA is explicitly forbidden. - Where in DNS do CAA records live?
- CAA records are published at the domain apex
and at any sub-domain. RFC 8659 §3 defines a
tree-walking algorithm: when a CA evaluates
issuance for a hostname, it queries CAA for
that name; if no CAA records are returned, it
walks up the DNS tree one label at a time
(
mx.example.com→example.com→com) until it finds CAA records or reaches a Top Level Domain. The closest set of CAA records wins. So a record atexample.comgoverns issuance for every sub-domain unless overridden by a more-specific CAA record. - Does CAA work with DNSSEC?
- CAA does not require DNSSEC, but DNSSEC strengthens it considerably. Without DNSSEC, a network attacker positioned between the CA and the authoritative resolver can spoof empty CAA responses and trick the CA into issuing a certificate it would otherwise refuse. With DNSSEC, the CAA response is cryptographically signed end-to-end and cannot be spoofed. The CA/Browser Forum requires CAA checking but does not yet require DNSSEC validation — DNSSEC remains best-practice.
- Does DMARC Analyzer check CAA records?
- Yes. DMARC Analyzer's Domain Security Checker
(
domain_checker.php) performs live CAA lookups via theDnsChecker.phphelper, surfacing the published issuers, anyiodefcontact, and warning when a domain has no CAA record published (which means every CA is implicitly authorised). The DNS Record Generator (dns_generator.php) includes a CAA wizard that builds well-formed records with flags, tag, and value fields validated against RFC 8659.
12. Audit your CAA records now
DMARC Analyzer's Domain Security Checker performs
live CAA lookups via
includes/DnsChecker.php, surfacing
the published issue /
issuewild / iodef
records inline with SPF, DKIM, DMARC, MTA-STS,
BIMI, and DNSSEC results. A missing CAA record
surfaces as a security finding so you can spot
default-open issuance posture before a CA is
tricked into mis-issuing. The DNS Record
Generator's CAA wizard builds well-formed records
with RFC 8659 syntax validation and a curated
list of canonical CA identifiers — copy the
output directly into your DNS provider.