คำตอบสั้น ๆ: ขอใบรับรองที่ครอบคลุมทุกซับโดเมนด้วยวิธียืนยันผ่าน DNS พร้อมตั้งต่ออายุอัตโนมัติผ่าน API ของผู้ให้บริการ DNS
คู่มือนี้อธิบาย Challenge ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
ใบรับรองแบบ Wildcard ครอบคลุมทุกซับโดเมนในระดับเดียว เช่น *.example.com ใช้ได้กับ www, api, app และซับโดเมนใหม่ที่จะสร้างในอนาคต โดยไม่ต้องขอใบรับรองใหม่ทุกครั้ง
ข้อแตกต่างสำคัญคือ Let's Encrypt บังคับให้ยืนยันความเป็นเจ้าของผ่าน DNS เท่านั้นสำหรับ Wildcard วิธียืนยันผ่านไฟล์บนเว็บแบบที่ใช้กับโดเมนธรรมดาใช้ไม่ได้ คู่มือนี้ทำทั้งแบบใส่ TXT ด้วยมือและแบบอัตโนมัติ
สิ่งที่ต้องเตรียม
- โดเมนที่คุณควบคุม DNS ได้
- เซิร์ฟเวอร์ Linux และสิทธิ์
sudo - หากต้องการต่ออายุอัตโนมัติ ต้องมี API Token ของผู้ให้บริการ DNS
# Ubuntu / Debian
sudo apt install -y certbot
# AlmaLinux / Rocky Linux
sudo dnf install -y certbot
ขั้นตอนที่ 1: ทดลองขอแบบใส่ TXT ด้วยมือ
เหมาะสำหรับทดลองครั้งแรกหรือกรณีที่ผู้ให้บริการ DNS ไม่มี API
sudo certbot certonly --manual \
--preferred-challenges dns \
-d 'example.com' -d '*.example.com' \
--agree-tos -m [email protected]
Certbot จะหยุดและแสดงค่าที่ต้องนำไปสร้าง TXT Record
Please deploy a DNS TXT record under the name:
_acme-challenge.example.com
with the following value:
abcdEFGH1234...
อย่ากด Enter ทันที ให้ไปสร้าง TXT Record ที่ผู้ให้บริการ DNS ก่อน แล้วรอจนกว่าจะเผยแพร่จริง ตรวจจากอีก Terminal หนึ่ง
dig +short TXT _acme-challenge.example.com
dig +short TXT _acme-challenge.example.com @8.8.8.8
เมื่อเห็นค่าตรงกับที่ Certbot แจ้งแล้วจึงกด Enter หากกดเร็วเกินไปจะล้มเหลวและต้องเริ่มใหม่ทั้งหมด
ข้อควรรู้ การขอทั้ง example.com และ *.example.com พร้อมกันจะมี TXT สองค่าใต้ชื่อเดียวกัน ต้องใส่ทั้งสองค่า ไม่ใช่แทนที่ค่าเดิม
ขั้นตอนที่ 2: ตั้งค่าแบบอัตโนมัติด้วย Cloudflare
วิธีนี้ทำให้ต่ออายุอัตโนมัติได้ ซึ่งจำเป็นเพราะใบรับรองมีอายุ 90 วัน
sudo apt install -y python3-certbot-dns-cloudflare
สร้าง API Token ที่ Cloudflare โดยให้สิทธิ์เฉพาะ Zone DNS Edit ของโดเมนนั้น อย่าใช้ Global API Key เพราะมีสิทธิ์ทุกอย่างในบัญชี
sudo mkdir -p /root/.secrets
sudo nano /root/.secrets/cloudflare.ini
dns_cloudflare_api_token = your-scoped-token-here
sudo chmod 600 /root/.secrets/cloudflare.ini
ขอใบรับรอง
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
--dns-cloudflare-propagation-seconds 30 \
-d 'example.com' -d '*.example.com' \
--agree-tos -m [email protected] --non-interactive
ไฟล์ที่ได้จะอยู่ที่ /etc/letsencrypt/live/example.com/
ขั้นตอนที่ 3: ผู้ให้บริการ DNS อื่น
Certbot มีปลั๊กอินสำหรับผู้ให้บริการหลายราย ติดตั้งตัวที่ตรงกับของคุณ
sudo apt install -y python3-certbot-dns-route53 # AWS Route 53
sudo apt install -y python3-certbot-dns-digitalocean # DigitalOcean
sudo apt install -y python3-certbot-dns-google # Google Cloud DNS
sudo apt install -y python3-certbot-dns-rfc2136 # BIND ที่รองรับ dynamic update
หากผู้ให้บริการของคุณไม่มีปลั๊กอิน ทางออกที่ใช้กันคือมอบหมาย _acme-challenge ไปยัง DNS ที่มี API ด้วย CNAME ครั้งเดียว
_acme-challenge.example.com. CNAME _acme-challenge.example.com.acme-delegated.net.