ความรู้ใหม่เรื่อง Certificate Authority Authorization (CAA)
CAA เป็นชนิดของ DNS record ที่อนุญาตให้เจ้าของระบุว่า Certificate Authority (CA) ไหนที่จะออก cert ให้สำหรับ domain นี้ได้บ้าง ซึ่ง CAA ถูกกำหนดในปี 2019 ที่ RFC 8659 และ RFC 8657 ดังนั้นการระบุ CAA ไว้ ก็จะช่วงลดความเสี่ยงที่ใครจะมาออก Cert สำหรับ domain ของเราไปได้ ถ้าจะให้เปรียบเทียบให้ใกล้ตัวเรามากขึ้น CAA เป็น Resource Record ใน DNS พี่น้องของ CAA เช่น A, AAAA, CNAME, MX, TXT, SRV ดังนั้น เราจัดการ A record อย่างไร เราก็จัดการ CAA แบบนั้นเหมือนกัน
> dig caa www.d8k.dev ; <<>> DiG 9.18.27 <<>> caa www.d8k.dev ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 439 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: 1f1a08b8d163ebf70100000066ab6658b0e9eef61abce2c4 (good) ;; QUESTION SECTION: ;www.d8k.dev. IN CAA ;; ANSWER SECTION: www.d8k.dev. 3600 IN CAA 0 issue "digicert.com" ;; Query time: 37 msec ;; SERVER: 192.168.254.254#53(192.168.254.254) (UDP) ;; WHEN: Thu Aug 01 17:41:28 +07 2024 ;; MSG SIZE rcvd: 99
สิบปากว่า ไม่เท่าตาเห็น
จากที่อ่านตามทฤษฎี พอเข้าใจล่ะว่าหลักการคืออะไร ก็ต้องลองของกันหน่อย สิ่งที่เข้าใจ และการทำงานจริงตรงกันไหม ผมวางแผนการทดสอบประมาณนี้ครับ
- ใช้ domain d8k.dev เป็นตัวทดสอบ โดยที่จะกำหนด CAA record ให้กับ www.d8k.dev
- กำหนด CAA record ของ www.d8k.dev ให้ issue เป็น digicert.com นั่นแปลว่า ผมจะสร้าง Key pair สำหรับ www.d8k.dev ได้จาก DigiCert เท่านั้น ตามหลักการ
- ทดสอบสร้าง Key pair สำหรับ www.d8k.dev จาก Let's encrypt ซึ่งผลที่คาดว่าจะได้ ก็คือ ไม่สามารถสร้าง key pair จาก let's encrypt ได้
- กำหนด CAA record ของ www2.d8k.dev ให้ issue เป็น letsencrypt.org และ ทดสอบสร้าง Key pair สำหรับ www2.d8k.dev จาก Let's encrypt
ผมใช้คำสั่ง dig caa www.d8k.dev เพื่อตรวจสอบข้อมูล ก็จะเห็นว่า ผมกำหนด CCA ของ www.d8k.dev ให้ issue เป็น digicert.com และ คำสั่ง dig caa www2.d8k.dev มีข้อมูล issue เป็น letsencrypt.org
> dig caa www2.d8k.dev ; <<>> DiG 9.18.27 <<>> caa www2.d8k.dev ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13227 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: 4b720be1b44e75950100000066ac7f1d6ca0ee8c6d576bce (good) ;; QUESTION SECTION: ;www2.d8k.dev. IN CAA ;; ANSWER SECTION: www2.d8k.dev. 3594 IN CAA 0 issue "letsencrypt.org" ;; Query time: 0 msec ;; SERVER: 192.168.254.254#53(192.168.254.254) (UDP) ;; WHEN: Fri Aug 02 13:39:25 +07 2024 ;; MSG SIZE rcvd: 103
ทดสอบสร้าง Key Pair สำหรับ www.d8k.dev ด้วยคำสั่ง certbot พบว่าไม่สามารถสร้างได้
$ sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials DOCredFile -d "www.d8k.dev" Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for www.d8k.dev Unsafe permissions on credentials configuration file: /home/drs/DOCredFile Waiting 10 seconds for DNS changes to propagate Certbot failed to authenticate some domains (authenticator: dns-digitalocean). The Certificate Authority reported these problems: Domain: www.d8k.dev Type: caa Detail: CAA record for www.d8k.dev prevents issuance Hint: The Certificate Authority failed to verify the DNS TXT records created by --dns-digitalocean. Ensure the above domains are hosted by this DNS provider, or try increasing --dns-digitalocean-propagation-seconds (currently 10 seconds). Some challenges have failed. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
ทดสอบสร้าง Key Pair สำหรับ www2.d8k.dev ด้วยคำสั่ง certbot พบว่าสามารถสร้างได้ตามปกติ
$ sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials DOCredFile -d "www2.d8k.dev" Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for www2.d8k.dev Unsafe permissions on credentials configuration file: /home/drs/DOCredFile Waiting 10 seconds for DNS changes to propagate Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/www2.d8k.dev/fullchain.pem Key is saved at: /etc/letsencrypt/live/www2.d8k.dev/privkey.pem This certificate expires on 2024-10-31. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -