CAA: control which CAs can issue certificates for you
Lock certificate issuance to your CA and no one else
The threat
Without a CAACAATLS / PKICertification Authority Authorization: a DNS record naming which certificate authorities may issue TLS certificates for your domain, blocking rogue or mistaken issuance. record, any public Certificate Authority will issue a TLS certificate for your domain to whoever can pass their validation. If an attacker ever tricks a CA (or a CA is compromised), they can mint a valid cert for your site and impersonate you with a green padlock. CAA (Certification Authority Authorization) tells the worldβs CAs: only these are allowed to issue for me, everyone else, refuse.
The exact fix
Our site is served by Netlify, which uses Letβs Encrypt. Add three CAA records. If your DNSDNSInfrastructureThe Domain Name System, the internet's address book. It's also where you publish the SPF, DKIM, DMARC and CAA records that secure your domain. panel splits the record into Flag / Tag / Value fields, use the columns below; if itβs one box, the equivalent string is in the last column.
| Type | Name | Flag | Tag | Value | One-line equivalent |
|---|---|---|---|---|---|
| CAA | @ | 0 | issue | letsencrypt.org | 0 issue "letsencrypt.org" |
| CAA | @ | 0 | issuewild | letsencrypt.org | 0 issuewild "letsencrypt.org" |
| CAA | @ | 0 | iodef | mailto:security@yourdomain.com | 0 iodef "mailto:security@yourdomain.com" |
issue covers normal certs, issuewild covers wildcards, and iodef is the address a CA emails if someone attempts an unauthorized issuance. TTL 3600.
If you ever switch CAs, add that CA to the
issue/issuewildrecords too, otherwise renewals fail.
Verify it
dig +short CAA yourdomain.com
Expected:
0 issue "letsencrypt.org"
0 issuewild "letsencrypt.org"
0 iodef "mailto:security@yourdomain.com"
Proof
These three records were the β1 that tipped dev3lop.com over the line from B (89) to grade A (90), and set up the final move to a perfect 100.