HTTPfy

CAA record

A CAA (Certification Authority Authorization) record lists the certificate authorities allowed to issue TLS certificates for a domain. Publicly trusted CAs must check it before every issuance.

type code 257 RFC 8659RFC 8657

Live CAA records from real domains

Checked at via public DNS
google.comCAA
google.com. 75947 IN CAA 0 issue "pki.goog"
  ; Google Trust Services may issue certificates
github.comCAA
github.com. 1615 IN CAA 0 issue "digicert.com"
  ; DigiCert may issue certificates
github.com. 1615 IN CAA 0 issue "globalsign.com"
  ; GlobalSign may issue certificates
github.com. 1615 IN CAA 0 issue "letsencrypt.org"
  ; Let's Encrypt may issue certificates
github.com. 1615 IN CAA 0 issue "sectigo.com"
  ; Sectigo (also issues for ZeroSSL) may issue certificates
github.com. 1615 IN CAA 0 issuewild "digicert.com"
  ; DigiCert may issue wildcard certificates
github.com. 1615 IN CAA 0 issuewild "letsencrypt.org"
  ; Let's Encrypt may issue wildcard certificates
github.com. 1615 IN CAA 0 issuewild "sectigo.com"
  ; Sectigo (also issues for ZeroSSL) may issue wildcard certificates
paypal.comCAA
paypal.com. 3600 IN CAA 0 issue "digicert.com"
  ; DigiCert may issue certificates
paypal.com. 3600 IN CAA 0 issue "quovadisglobal.com"
  ; DigiCert (QuoVadis) may issue certificates
paypal.com. 3600 IN CAA 0 issue "visa.com"
  ; visa.com may issue certificates
gmail.comCAA
gmail.com. 86400 IN CAA 0 issue "digicert.com"
  ; DigiCert may issue certificates
gmail.com. 86400 IN CAA 0 issue "pki.goog"
  ; Google Trust Services may issue certificates

What the CAA record does

Before issuing for www.shop.example.com, a CA queries CAA at that name. If the answer is empty it climbs to shop.example.com, then example.com, stopping at the first name that has a CAA set. If none is found anywhere, any CA may issue. The relevant set completely replaces any set higher up the tree, so a subdomain with its own CAA records does not inherit the parent's.

The CA/Browser Forum Baseline Requirements have made CAA checking mandatory since 2017. RFC 8657 adds parameters that tie issuance to a specific ACME account (accounturi) or validation method (validationmethods).

Zone-file syntax

example.com.  3600  IN  CAA  0 issue "letsencrypt.org"
example.com.  3600  IN  CAA  0 issuewild ";"
example.com.  3600  IN  CAA  0 iodef "mailto:[email protected]"

Wire format: RDATA is a flags octet, a tag length octet, the tag (ASCII), then the value (the rest of the RDATA).

Fields

FieldMeaning
Flags0, or 128 (issuer critical): a CA that does not understand the tag must refuse to issue.
issueIssuer domain of a CA allowed to issue any certificate, e.g. letsencrypt.org, pki.goog, digicert.com. A value of ; means none.
issuewildSame, for wildcard certificates only. If present it overrides issue for wildcards.
iodefWhere a CA may report a refused request: mailto: or https: URL.

Common mistakes

  • Adding CAA for your main CA and forgetting the CA your CDN or load balancer uses for its managed certificates. Renewals start failing silently.
  • issuewild ";" while relying on a wildcard certificate.
  • Using a CA brand name ("Sectigo") instead of its issuer domain (sectigo.com).
  • A subdomain CNAMEd to a provider whose zone has restrictive CAA, so the provider's records apply instead of yours.

Specification

  • RFC 8659: DNS Certification Authority Authorization (CAA) Resource Record
  • RFC 8657: CAA Record Extensions for Account URI and ACME Method Binding

Related record types

  • TLSA: DANE certificate pinning in DNS
  • TXT: free-form text for verification and policy
  • HTTPS: ALPN, address hints and ECH for websites

All DNS record types