Let’s Encrypt คำสั่งเดียว เคาะ enter ครั้งเดียวจบ เป็นเรื่องราวเล่าเรื่องการร้องของ TLS Certificate จาก Let’s Encrypt ที่จำเป็นต้องตอบ Challenge เพื่อยืนยันความเป็นเจ้าของ Domain โดยที่ฝาก DNS ไว้ที่ DigitalOcean แบบที่จะทำให้ง่ายสะดวกขึ้น เราไม่จำเป็นต้องไปกำหนดค่าใน DNS เอง สั่ง certbot ที่เราเลือกใช้ จะเชื่อมต่อไปยัง DigitalOcean และเพิ่ม TXT Record ให้เราโดยอัตโนม้ติ
แต่ก็ไม่ได้จำกัดเฉพาะคนที่ใช้ DigitalOcean ครับถ้าอ่านแล้วพอเห็นภาพในหลักการ สามารถนำไปประยุกต์ใช้กับคนที่ฝาก DNS ไว้ที่อื่น ๆ ได้
ออกตัวก่อนว่า ผมไม่ได้รู้อะไรมากเกี่ยวกับ Let’s Encrypt เป็นเพียงแค่ผู้ใช้คนหนึ่งที่ได้มีโอกาสได้ใช้งาน เป็นครั้งคราว และส่วนใหญ่ก็จะใช้งานกับ Web Server เอาใช้งานกับ NGINX เป็นส่วนใหญ่ ในบางกรณีก็จะไปใช้งานกัน Cockpit อยู่บ้าง ดังนั้นการใช้งานได้ครั้งละ 3 เดือน ผมก็ไม่ได้เดือดร้อนอะไร หมดอายุก็หมดไป ไม่เคยต้องใช้งานติดต่อกันอยู่แล้ว แต่ช่วงนี้ผมเริ่มทำ blog ที่กำลังอ่านอยู่นี่แหละครับ นั่นแปลว่าผมต้องคอยต่ออายุอยู่เรื่อย ๆ ไม่ปล่อยให้ Certficate หมดอายุ นี่แหละครับที่มาของ blog ตอนนี้ก็เกิดขึ้น
ความรู้เดิม
เอาเข้าจริง ๆ ความรู้เดิมของ Let’s encrypt ผมก็คือ “Google” … ก็ได้รู้จักคำสั่ง certbot มีตัวอย่างมี tutorial มี how to ให้เลียบแบบ ก็ใช้งานแบบนั้นได้มาหลายปี โดยหลักการใช้งาน certbot ก็คือ เราจะเรียกคำสั่ง certbot ตามด้วย option ต่าง ๆ หนึ่งใน option ที่เราต้องส่งไปคือ Challenge Types หลังจากนั้น Let’s Encrypt ก็จะส่ง challenge กลับมาเพื่อพิสูจน์ว่า เราเป็นเจ้าของ domain นั้นจริง ๆ … เจ้า Challenge นี่แหละครับมันจะเพิ่มขั้นตอนอีกหลายขั้นตอนกว่าจะตอนโจทย์การ Challenge ของ Let’s Encrypt ได้ ไหน ๆ ก็พาดพิงวิธีการ Challenge ของ Let’s Encrypt มาลองดูกันหน่อยว่า Challenge Type มีอะไรกันบ้าง
-
HTTP-01 challenge วิธีการนี้ Let’s Encrypt จะบอกให้เราสร้างไฟล์ที่ประกอบไปที่ด้วยมูลตามที่บอก ไว้ที่
http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create a file containing just this data: o-CIOmq5nt2DJM_ZyApFHXqBrHLnl_pjngazKF0UyXE.EYpak-qP9OFk_1-EsI4pDjz2Oxcqknwto0igDCLZZz0 And make it available on your web server at this URL: http://web.d8k.io/.well-known/acme-challenge/o-CIOmq5nt2DJM_ZyApFHXqBrHLnl_pjngazKF0UyXE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
DNS-01 challenge วิธีการนี้ Let’s Encrypt จะบอกให้เราสร้าง DNS TXT record ให้มีค่าตามที่ระบุ
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name: _acme-challenge.web.d8k.io. with the following value: 1jV9VvSZsK92Tht1d2LiAoxJs6R0Iq3mAwlhRrQN2FM Before continuing, verify the TXT record has been deployed. Depending on the DNS provider, this may take some time, from a few seconds to multiple minutes. You can check if it has finished deploying with aid of online tools, such as the Google Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.web.d8k.io. Look for one or more bolded line(s) below the line ';ANSWER'. It should show the value(s) you've just added. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
TLS-ALPN-01 ก็เป็นอีกวิธีการที่ถูกพัฒนาต่อยอดมากจาก TLS-SNI-01 ซึ่งวิธีการนี้ถูกยกเลิกไปเรียบร้อยแล้ว วิธิีการนี้ Let’s Encrypt พยายามเชื่อต่อกับมายัง Web Server ของเรา ตาม domain ที่เราระบุไว้ แล้วใช้ Application-Layer Protocol Negotiation - ALPN ซึ่งเป็นส่วนต่อยอดเพิ่มเติมจาก Transport Layer Security (TLS) ในการตรวจสอบ
ปกติผมใช้วิธีการ DNS-01 Challenge
โง่มาก่อนฉลาด
เมื่อความขี้เกียจเข้าครอบงำ การต้องทำโน่นนี่นั่นที่มันซับซ้อน เพื่อตอบ Challenge ไม่ใช่วิถีของเรา … มันต้องมีทางสิ มันต้องมีคนคิดเหมือนเราสิ สุดท้ายก็ไปเจอ (จริง ๆ Google บอก)ว่า certbot มี plugin และหนึ่งในตัวนั้นผมใช้งานอยู่พอดี ก็คือ domain ของผมถูกฝากไว้ที่ DigitalOcean สามารถใช้งานได้ ข้อมูลพื้นฐานในการทดสอบ
- ทดสอบเรียกใช้งาน certbot บท Ubuntu 22.04 LTS
- Domain ผมชี้ NS record ไว้ที่ DigitalOcean
- ทดสอบร้องขอ Certificate สำหรับ web.d8k.io
- นำ API Credential ของ DigitalOcean ไปสร้างไฟล์ $HOME/.digitaloceanrc
dns_digitalocean_token = <Digital Ocean's API Key>
เราจำเป็นติดตั้ง plugin เพิ่ม หลังจากนั้นในการเรียกคำสั่ง certbot ก็ระบุ option --dns-digitalocean-credentials
และกำหนด API Credential ไว้ให้ หลังจากนั้น certbot จะร้องขอไปยัง DigitalOcean เพื่อขอสร้าง TXT Record ของ DNS ใน DigitalOcean เพื่อตอบโจทย์การ Chanllenge ของ Let’s Encrypt ให้อัตโนมัติ
# sudo apt install -y certbot
[... truncated output ...]
The following NEW packages will be installed:
certbot python3-acme python3-certbot python3-configargparse python3-icu python3-josepy python3-parsedatetime python3-requests-toolbelt python3-rfc3339
python3-zope.component python3-zope.event python3-zope.hookable
0 upgraded, 12 newly installed, 0 to remove and 139 not upgraded.
[... truncated output ...]
# sudo apt install -y python3-certbot-dns-digitalocean
[... truncated output ...]
The following NEW packages will be installed:
python3-certbot-dns-digitalocean python3-digitalocean python3-jsonpickle
[... truncated output ...]
# sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/.digitaloceanrc -d "web.d8k.io"
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for web.d8k.io
Waiting 10 seconds for DNS changes to propagate
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/web.d8k.io/fullchain.pem
Key is saved at: /etc/letsencrypt/live/web.d8k.io/privkey.pem
This certificate expires on 2023-06-18.
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ผลจากการเรียกคำสั่ง จะร้องขอ Let’s Encryption มาเก็บไว้ที่ /etc/letsencrypt/live/domain
ตรวจสอบรายละเอียดของ Certificate ที่ได้รับมาจาก Let’s Encrypt
# pwd
/etc/letsencrypt/live/web.d8k.io
# openssl x509 -in cert.pem -text | grep "Subject: CN"
Subject: CN = web.d8k.io
Referrence:
- https://letsencrypt.org/docs/challenge-types/
- https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation
- https://www.digitalocean.com/community/tutorials/how-to-acquire-a-let-s-encrypt-certificate-using-dns-validation-with-certbot-dns-digitalocean-on-ubuntu-20-04