ออก SSL ฟรีด้วย acme.sh: ทางเลือก Certbot สำหรับ Linux Server

หากคุณเช่า VPS Linux แล้วต้องการ SSL Certificate ฟรีจาก Let's Encrypt acme.sh เป็นทางเลือกที่น่าพิจารณา แทนที่จะใช้ Certbot เพียงอย่างเดียว บทความนี้จะอธิบายว่า acme.sh คืออะไร ติดตั้งอย่างไร และออกใบเซอร์ให้กับเว็บไซต์บนเซิร์ฟเวอร์ของคุณอย่างไร

acme.sh คืออะไร

acme.sh เป็น pure-shell script (ไฟล์ bash ธรรมดา) ที่ใช้โปรโตคอล ACME (Automated Certificate Management Environment) เพื่อออก SSL/TLS certificate ฟรีจาก Let's Encrypt หรือ ZeroSSL โดยไม่ต้องติดตั้ง Python หรือไลบรารีหนัก ขนาดไฟล์เล็ก (เพียง ~100KB) แต่สามารถจัดการ certificate ได้ครบถ้วน ตั้งแต่การออกใบเซอร์ไปจนถึงการต่ออายุเอง

ความแตกต่างหลักที่ทำให้ acme.sh ดึงดูด ผู้ใช้ VPS คือความเรียบง่าย — ไม่ต้องติดตั้ง dependencies มากมาย รองรับ DNS API ของ provider ต่างๆ มากกว่า Certbot ทำให้ออก wildcard certificate ง่ายขึ้น และตั้งค่า auto-renewal ได้อย่างอยากง่าย

ทำไมต้อง acme.sh แทน Certbot

ในขณะที่ Certbot เป็นเครื่องมือยอดนิยมที่มี community ใหญ่ แต่ acme.sh มีข้อได้เปรียบในหลายด้าน ประการแรก acme.sh ไม่ต้องแนวทางภาษา Python ที่บางเซิร์ฟเวอร์อาจไม่มี หรือมีเวอร์ชันเก่าที่ขัดแย้งกัน ประการที่สอง acme.sh รองรับ DNS API plugin มากกว่า 100 ตัว ซึ่งทำให้การออก wildcard certificate ง่ายขึ้นมาก (ไม่ต้องเปิดพอร์ต 80 หรือ 443 ที่บางครั้งถูกไฟร์วอลล์บล็อก) ประการที่สาม acme.sh ขนาดเล็กและเรียบง่าย ทำให้เหมาะสำหรับ VPS ที่ต้องการระบบ lightweight

อย่างไรก็ตาม ถ้าคุณเช่า shared hosting เช่น AsiaGB hosting plan 500 บาท/ปี ที่มี DirectAdmin ติดตั้งแล้ว ก็ไม่ต้อง acme.sh — DirectAdmin มี Let's Encrypt ในตัวพร้อมอัตโนมัติแล้ว acme.sh เป้าหมายผู้ที่เช่า VPS และต้องการควบคุมเซิร์ฟเวอร์ด้วยตัวเอง

ขั้นตอนติดตั้ง acme.sh

การติดตั้ง acme.sh ง่ายมาก เพียงใช้คำสั่ง curl เพื่อดาวน์โหลดและรัน installer script ขั้นที่หนึ่ง เชื่อมต่อ VPS ด้วย SSH ด้วยบัญชี root (หรือ sudo) คำสั่ง:

  1. ดาวน์โหลด acme.sh: curl https://get.acme.sh | sh
  2. Reload shell environment: source ~/.bashrc หรือ logout และ login กลับ
  3. ยืนยันการติดตั้ง: acme.sh --version

ไฟล์ script จะติดตั้งอยู่ที่ ~/.acme.sh/ และ cronjob จะตั้งให้อัตโนมัติแล้ว ต่อจากนี้ก็พร้อมสำหรับการออกใบเซอร์

วิธีออก SSL Certificate ด้วย Webroot Mode

Webroot mode ใช้สำหรับ domain ปกติที่ต้องตรวจสอบการครอบครัวโดเมน (domain validation) โดยทำให้ Let's Encrypt ดาวน์โหลด token ชั่วคราวจากเว็บไซต์ของคุณ คำสั่ง:

  1. ตรวจสอบให้แน่ว่า web root ของเว็บคุณคือ /home/user/public_html (หรือ path อื่น)
  2. รันคำสั่ง: acme.sh --issue -d yourdomain.com -d www.yourdomain.com -w /home/user/public_html
  3. acme.sh จะส่งไฟล์ token ไปที่ web root และให้ Let's Encrypt ตรวจสอบ
  4. ถ้าสำเร็จ certificate จะบันทึกลงใน ~/.acme.sh/yourdomain.com/

Webroot mode เป็นวิธีที่ปลอดภัยและง่ายที่สุด ส่วนใหญ่ใช้ได้กับโดเมนทั่วไป

วิธีออก Wildcard SSL ด้วย DNS API Mode

ถ้าต้องการ wildcard certificate (*.yourdomain.com) ต้องใช้ DNS API mode แทน ซึ่ง acme.sh มีรองรับ DNS provider นับร้อยตัว เช่น Cloudflare, DigitalOcean, AWS Route53 ฯลฯ ขั้นตอน: ตั้งค่า API credentials จาก DNS provider ของคุณ (เช่น Cloudflare API token) แล้วรันคำสั่ง:

  1. Export API credentials: export CF_Token="your_cloudflare_token"
  2. ออกใบเซอร์ wildcard: acme.sh --issue -d yourdomain.com -d "*.yourdomain.com" --dns dns_cf
  3. acme.sh จะสร้าง TXT record ใน DNS สำหรับตรวจสอบการครอบครองโดเมน
  4. ถ้าสำเร็จ certificate จะบันทึกที่ ~/.acme.sh/yourdomain.com/

Wildcard certificate เหมาะสำหรับผู้ที่มี subdomain หลายตัว เพราะ 1 ใบเซอร์ครอบคลุมทั้งหมด

ติดตั้ง Certificate ใน Nginx และ Apache

เมื่อออกใบเซอร์เรียบร้อย ขั้นต่อไปคือใช้ certificate นั้นกับ web server ด้วยคำสั่ง install:

  1. สำหรับ Nginx: acme.sh --installcert -d yourdomain.com --key-file /etc/nginx/ssl/yourdomain.com.key --fullchain-file /etc/nginx/ssl/yourdomain.com.crt --reloadcmd "systemctl reload nginx"
  2. สำหรับ Apache: acme.sh --installcert -d yourdomain.com --key-file /etc/apache2/ssl/yourdomain.com.key --fullchain-file /etc/apache2/ssl/yourdomain.com.crt --reloadcmd "systemctl reload apache2"
  3. acme.sh จะ copy ไฟล์ certificate และ key ไปยังตำแหน่งที่กำหนด
  4. Reload web server จะเกิดขึ้นอัตโนมัติให้ใช้ certificate ใหม่ทันที

จากนั้นในไฟล์ config Nginx/Apache ก็ชี้ไป certificate path ที่ติดตั้งไว้

การต่ออายุเซอร์อัตโนมัติ

ข้อดีของ acme.sh ที่ยิ่งใหญ่คือการต่ออายุ certificate อัตโนมัติ — acme.sh จะตั้ง cronjob ให้เอง เมื่อติดตั้งแล้ว cronjob จะรันทุกวัน 00:00 (UTC) และจะออกใบเซอร์ใหม่ก่อนหมดอายุ 30 วัน คุณไม่ต้องทำอะไรเพิ่มเติม ต่ออายุจะเกิดขึ้นโดยอัตโนมัติ

ถ้าต้องการดูสถานะ certificate ทั้งหมด ใช้คำสั่ง acme.sh --list ก็จะแสดง certificate และวันหมดอายุของแต่ละใบ

เทคนิคการแก้ปัญหา

ถ้าออกใบเซอร์ล้มเหลว ให้ตรวจสอบจุดต่อไปนี้: (1) ตรวจสอบว่า domain ชี้มาถูกต้อง โดย curl www.yourdomain.com และ curl yourdomain.com จะต้องสามารถเข้าถึงได้ (2) ตรวจสอบไฟร์วอลล์ — ให้แน่ว่าพอร์ต 80 (HTTP) เปิดอยู่ ถ้าใช้ DNS mode ก็ไม่ต้อง (3) ดูบันทึก log ด้วยคำสั่ง acme.sh --log เพื่อดูรายละเอียดข้อผิดพลาด (4) ถ้า HTTP mode ล้มเหลว ลองเปลี่ยนไป DNS mode แทน

เคล็ดลับ: VPS ของ AsiaGB ที่เช่าราคา 500 บาท/เดือน (Linux) หรือ 750 บาท/เดือน (Windows) ทำให้เหมาะสำหรับใช้ acme.sh ตรวจสอบให้แน่ว่ามี root access ครบถ้วนแล้ว ทำได้เลยเข้ามา SSH ติดตั้ง acme.sh และออกใบเซอร์ฟรีจาก Let's Encrypt โดยไม่มีค่าใช้จ่ายเพิ่มเติม

acme.sh เหมาะกับใคร

ข้อจำกัดและข้อควรระวัง

แม้ acme.sh มีข้อดีมาก แต่มีข้อจำกัดบางประการที่ต้องรู้ ประการแรก acme.sh ต้องการ SSH access และ root/sudo permissions ถ้าใช้ shared hosting ที่มี DirectAdmin (เช่น AsiaGB) มี UI ออก SSL ให้ในตัวอยู่แล้ว ไม่จำเป็นต้องใช้ acme.sh ประการที่สอง ถ้า firewall บล็อก DNS query หรือ HTTP port 80 acme.sh อาจทำงานได้ลำบาก ประการที่สาม Let's Encrypt มีขีดจำกัด rate limiting (ประมาณ 50 certificate ต่อ domain ต่อ 7 วัน) หากออกใบเซอร์เสี่ยมๆ อาจโดนจำกัด

ต้องการ SSL ฟรีบน VPS ของคุณ

ถ้าเช่า VPS Linux จาก AsiaGB เรียบร้อยแล้ว ก็สามารถติดตั้ง acme.sh และออก SSL Certificate ฟรีจาก Let's Encrypt ได้ทันทีโดยไม่มีค่าใช้จ่ายเพิ่มเติม VPS Linux เริ่มต้นเพียง 500 บาท/เดือน

เรียนรู้เพิ่มเติมเกี่ยวกับ VPS