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; 128 marks the record critical), tag (issue, issuewild, or iodef), and value (a quoted string — CA identifier for issue/issuewild; URI for iodef).
  • 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

  1. 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".
  2. When a CA receives a certificate-signing request for foo.bar.example.com, it performs the CAA tree-walking algorithm (RFC 8659 §3): query foo.bar.example.com for CAA records; if none, query bar.example.com; if none, query example.com; continue until CAA records are found or the parent is a TLD (com). The closest set of CAA records wins.
  3. The CA inspects the matched CAA records. If any issue (or issuewild for 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.
  4. If the matched records include an iodef tag, 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.
  5. 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.
  6. 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 the tag MUST 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 default 0 is 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), and iodef (declare a contact URI for violation reports). Additional tags are registered with IANA; current registrations include contactemail and contactphone from RFC 8657.
value
Quoted string. For issue and issuewild, the value is a CA identifier — typically the CA's primary domain name (letsencrypt.org, digicert.com, sectigo.com). For iodef, the value is a URI (mailto: or https:). An empty value (";") on an issue/issuewild tag 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.

4. CAA property tags

Tag Purpose Value Applies to
issue Authorise a CA to issue certificates (non-wildcard, and wildcard if no issuewild overrides). CA identifier (e.g. "letsencrypt.org") or ";" to forbid all. Plain hostname certificates (example.com, www.example.com).
issuewild Authorise a CA to issue wildcard certificates. When present, overrides issue for wildcard requests. Same format as issue. ";" forbids wildcard issuance entirely. Wildcard certificates (*.example.com).
iodef Declare a contact URI where CAs should report policy-violation attempts. URI: "mailto:security@example.com" or "https://example.com/iodef". Informational — does not gate issuance. CAs SHOULD send Incident Object Description Exchange Format (IODEF) reports per RFC 7970.
contactemail Declare a domain-validation contact email (RFC 8657). Email address as a quoted string. Some CAs use this for email-based domain validation challenges.
contactphone Declare a domain-validation contact phone (RFC 8657). Phone number as a quoted string. Used for phone-based domain validation by select CAs.

Interaction rule for issuewild: when a CA evaluates a wildcard issuance, it FIRST looks for issuewild records and uses those. If no issuewild records exist, it falls back to issue. So 0 issue "letsencrypt.org" alone authorises both regular AND wildcard certificates from Let's Encrypt; adding 0 issuewild ";" alongside it forbids wildcards specifically while keeping non-wildcard issuance authorised.

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 iodef URI. Without it, attempted unauthorised issuances are silent — you only learn about them after the fact (if ever). A mailto:security@example.com contact 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-01 guarantees 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 .org TLD. Always copy from the CA's documentation.
  • Missing the issuewild record. Operators sometimes publish 0 issue "letsencrypt.org" and assume that blocks wildcard issuance from other CAs. It doesn't — wildcards from Let's Encrypt are still authorised by the issue tag in the absence of an explicit issuewild override. To block wildcards, publish 0 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 their notAfter date. 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 — use 0 and reserve 128 for genuinely-new extensions.
  • Using http:// for the iodef URI. Plain HTTP endpoints accept reports but are unauthenticated and can be tampered with. Use https:// or mailto:.
  • Publishing CNAME for the mta-sts host 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 issue records 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 issuewild record that doesn't authorise the CA — if present, it takes precedence over issue for wildcards. Either add an issuewild for the desired CA or remove the conflicting one.
I'm getting iodef reports for attempted issuance I didn't initiate
This is exactly what iodef is 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's 1.1.1.1 is a good no-cache test resolver.
How do I see CAA records for an arbitrary domain?
Use dig CAA example.com +short from any modern dig install (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, typically 0; 128 marks the record critical), tag (one of issue, issuewild, or iodef), and value (a quoted string — the CA identifier for issue/issuewild, a contact URI for iodef). A typical record is: example.com. IN CAA 0 issue "letsencrypt.org" — authorising Let's Encrypt to issue certificates for example.com.
What is the difference between issue, issuewild, and iodef?
issue authorises a CA to issue certificates for the exact domain (and, by default, wildcard certificates unless an issuewild record overrides it). issuewild authorises a CA to issue wildcard certificates (*.example.com); when present, it takes precedence over issue for wildcard requests. iodef declares a contact URI (typically mailto: or https:) where CAs should report attempted policy violations. iodef is informational; issue and issuewild are enforcement records.
What is the empty-issue value ";"?
An issue value of ";" (just a semicolon) is the explicit "no CAs authorised" marker. Publishing 0 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 at example.com governs 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 the DnsChecker.php helper, surfacing the published issuers, any iodef contact, 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.

Check my CAA records Sign up — Free plan