The primary purpose of CAA records is to put certificate issuers on notice that only a particular CA (or list of CAs) is supposed to issue certificates for a particular domain. However, it seems like it would also be useful for software that relies on certificates to be able to verify that the certificate chain they just received was legitimately issued, according to the CAA records for the domain. I can't figure out how to do this.
Let's have a concrete example: suppose this CAA record exists in the DNS (it doesn't right now)
www.owlfolio.org. IN CAA 0 issue "letsencrypt.org"
The web server at www.owlfolio.org does in fact have a certificate issued by LE, as we can see by running a command like this...
openssl s_client -showcerts -verify 4 -no-interactive -connect www.owlfolio.org:443 < /dev/null
verify depth is 4
Connecting to 2a00:1098:88:ea::1
CONNECTED(00000003)
depth=2 C=US, O=Internet Security Research Group, CN=ISRG Root X1
verify return:1
depth=1 C=US, O=Let's Encrypt, CN=E8
verify return:1
depth=0 CN=www.owlfolio.org
verify return:1
---
Certificate chain
0 s:CN=www.owlfolio.org
i:C=US, O=Let's Encrypt, CN=E8
a:PKEY: id-ecPublicKey, 256 (bit); sigalg: ecdsa-with-SHA384
v:NotBefore: Oct 1 17:52:34 2025 GMT; NotAfter: Dec 30 17:52:33 2025 GMT
-----BEGIN CERTIFICATE-----
MIIDijCCAxGgAwIBAgISBj5egdR0GJN2r/rEbQJonJdBMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEwMDExNzUyMzRaFw0yNTEyMzAxNzUyMzNaMBsxGTAXBgNVBAMTEHd3
dy5vd2xmb2xpby5vcmcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARejTKeFoRm
Wuo4epvmQ+lkMiSDSNmf5Vz0lCQTdSGYhqd/ohZoL8euWjqZ22WfJ2aBolrx5p8i
TZH4z0FdMvZ/o4ICHDCCAhgwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsG
AQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTPOhspRzr9
v79d2HGxKieNewRYnzAfBgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAy
BggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9y
Zy8wGwYDVR0RBBQwEoIQd3d3Lm93bGZvbGlvLm9yZzATBgNVHSAEDDAKMAgGBmeB
DAECATAtBgNVHR8EJjAkMCKgIKAehhxodHRwOi8vZTguYy5sZW5jci5vcmcvNjYu
Y3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHQApELFBklgYVSPD9TqnPt6LSZF
TYepfy/fRVn2J086hFQAAAGZoR0hIwAABAMARTBDAiBuA+3NiIiec4lg8K0U0LSk
UqVYCchg8RyZkyzsz763wQIfelLCc69PVB+Cu04vBJ8fUJV6+8bSLczvLwwh0xV9
pAB2ABmG1Mcoqm/+ugNveCpNAZGqzi1yMQ+uzl1wQS0lTMfUAAABmaEdIgYAAAQD
AEcwRQIgXU5fjYcBX7j/XIpOzya6cobJGM1FBUWo+/dQq6AR+5ICIQCGGBtia/zD
c2RB8MIvyrX+PMJMA8V2w/dAk/NfzeuZZjAKBggqhkjOPQQDAwNnADBkAjBt7SHc
qooq4hstNyEQCqxjPyyyZaFZLaRSzvxh9lmPg4M1al70CMFZ+mYd76PKlhwCMDBX
XG+HzjAJQo9QV9kYZsUOzjrpP+NmUslvePmw9kCUkRK3w7RnlYbAvc9LVarzBg==
-----END CERTIFICATE-----
1 s:C=US, O=Let's Encrypt, CN=E8
i:C=US, O=Internet Security Research Group, CN=ISRG Root X1
a:PKEY: id-ecPublicKey, 384 (bit); sigalg: RSA-SHA256
v:NotBefore: Mar 13 00:00:00 2024 GMT; NotAfter: Mar 12 23:59:59 2027 GMT
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
---
Server certificate
subject=CN=www.owlfolio.org
issuer=C=US, O=Let's Encrypt, CN=E8
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2384 bytes and written 391 bytes
Verification: OK
---
[further chatter elided]
But neither the intermediate nor the root certificate contains the string letsencrypt.org anywhere, as far as I can tell. The Subject tag for the intermediate is "C=US, O=Let's Encrypt, CN=E8", the Subject tag for the root is "C=US, O=Internet Security Research Group, CN=ISRG Root X1", and the various URLs embedded in the certificates all point into the ancillary domain lencr.org.
So I'm stumped. Is there a way for a program to verify that issue "letsencrypt.org" in the CAA record licenses a signature by C=US, O=Let's Encrypt in an intermediate certificate? And the same for other issuers.