I got this from Feisty Duck's Cryptography & Security Newsletter:
The baseline version of CAA has been mandatory since September 2017, but it's insufficient for our needs. There is another document (RFC 8657) that bridges the ACME protocol for automated certificate issuance and CAA, adding support for fine-grained permissions.
With ACME CAA extensions, we can solve both problems we outlined earlier, with the help of a single CAA resource record in our DNS that looks something like this:
example.com. CAA 0 issue "letsencrypt.org; accounturi=https://acme-v02.api.letsencrypt.org/acme/acct/1726001367; validationmethods=dns-01"
What Does This Do?
On the left, we see the domain name for which we want to control certificate issuance, in this case,
example.com. On the right, we have three controls:
- The first is the identity of a CA that's allowed to issue certificates for the domain name, in this case,
letsencrypt.org.- The second control is the
accounturiinstruction, which locks down issuance only to the named ACME account. Because ACME always uses encryption and strong cryptographic authentication, this section ensures that only authorized users can request certificates for this domain name.- The third control is the
validationmethodsinstruction, which locks down issuance to use only one DNS-based domain validation method. When DNSSEC is enabled for a domain name, this section ensures that all domain validation operations are cryptographically secure. With this, we no longer care about other insecure methods; the CA won't accept them in the first place.
So I Decided to Put It to the Test
I have tested issuance with updated CAA records:
CAA 128 issue "letsencrypt.org; accounturi=...223017260; validationmethods=dns-01"
CAA 128 issuewild "letsencrypt.org; accounturi=...223017260; validationmethods=dns-01"
[Fri May 29 11:45:02 PDT 2026] Your cert is in: /tmp/acme/riptidetech.io/riptidetech.io/riptidetech.io.cer
[Fri May 29 11:45:02 PDT 2026] Your cert key is in: /tmp/acme/riptidetech.io/riptidetech.io/riptidetech.io.key
[Fri May 29 11:45:02 PDT 2026] The intermediate CA cert is in: /tmp/acme/riptidetech.io/riptidetech.io/ca.cer
[Fri May 29 11:45:02 PDT 2026] And the full-chain cert is in: /tmp/acme/riptidetech.io/riptidetech.io/fullchain.cer
[Fri May 29 11:45:02 PDT 2026] Your pre-generated key for future cert key changes is in: /tmp/acme/riptidetech.io/riptidetech.io/riptidetech.io.key.next
[Fri May 29 11:45:03 PDT 2026] Running reload cmd: /tmp/acme/riptidetech.io/reloadcmd.sh
IMPORT CERT riptidetech.io, /tmp/acme/riptidetech.io/riptidetech.io/riptidetech.io.key, /tmp/acme/riptidetech.io/riptidetech.io/riptidetech.io.cer
update cert![Fri May 29 11:45:03 PDT 2026] Reload successful
What I can not yet prove is whether Let's Encrypt will actually enforce accounturi and validationmethods, or merely ignore them and proceed because the base issue "letsencrypt.org" authorization matches. ![]()
Guess we'll have to wait until March 2027.
As a heads up, Worked fine. No errors.
;@)