ติดตั้ง SSL ฟรีด้วย acme.sh บน VPS แทน Certbot
acme.sh คือ ACME client ที่เขียนด้วย pure shell script ไม่ต้องติดตั้ง dependency ใดๆ รองรับ Let's Encrypt, ZeroSSL และ Buypass รองรับ wildcard SSL ด้วย DNS challenge โดยเชื่อมกับ Cloudflare, Route53 และ DNS providers กว่า 150 ราย ข้อดีเหนือ Certbot คือ portable และ configure ได้ยืดหยุ่นกว่า
ติดตั้ง acme.sh
# ติดตั้งเป็น user ปกติ (ไม่ต้อง root)
curl https://get.acme.sh | sh -s [email protected]
# Reload shell
source ~/.bashrc
# ตรวจ
acme.sh --version
ออก SSL Certificate แบบ HTTP Challenge
# ต้องมี webroot และ domain ชี้มา VPS
acme.sh --issue -d yourdomain.com -d www.yourdomain.com \
--webroot /var/www/html
# หรือใช้ standalone mode (acme.sh bind port 80 เอง)
sudo acme.sh --issue -d yourdomain.com --standalone
Wildcard SSL ด้วย Cloudflare DNS
# ตั้ง Cloudflare API credentials
export CF_Key="your_global_api_key"
export CF_Email="[email protected]"
# หรือใช้ API Token (แนะนำกว่า)
export CF_Token="your_api_token"
export CF_Account_ID="your_account_id"
# ออก wildcard cert
acme.sh --issue -d yourdomain.com -d "*.yourdomain.com" \
--dns dns_cf
# CF credentials จะถูกบันทึกอัตโนมัติสำหรับ renew
ติดตั้ง Certificate เข้า Nginx
# ติดตั้ง cert ไปที่ /etc/ssl/acme/
sudo mkdir -p /etc/ssl/acme/yourdomain.com
acme.sh --install-cert -d yourdomain.com \
--cert-file /etc/ssl/acme/yourdomain.com/cert.pem \
--key-file /etc/ssl/acme/yourdomain.com/key.pem \
--fullchain-file /etc/ssl/acme/yourdomain.com/fullchain.pem \
--reloadcmd "sudo systemctl reload nginx"
# ตั้ง Nginx ใช้ cert จาก acme.sh
sudo nano /etc/nginx/sites-available/yourdomain.com
ssl_certificate /etc/ssl/acme/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/ssl/acme/yourdomain.com/key.pem;
ตรวจ Auto-Renew
# acme.sh ตั้ง cron อัตโนมัติแล้ว
crontab -l | grep acme
# Force renew test
acme.sh --renew -d yourdomain.com --force
# ดู cert expiry
acme.sh --list
~/.acme.sh/ ต้อง backup ทั้ง directory นี้ ถ้าสูญหายต้อง re-issue cert ใหม่ทั้งหมด
ตรวจสอบว่า SSL ทำงานถูกต้อง
# ดูรายการ cert ทั้งหมด
acme.sh --list
# ตรวจ expiry date
openssl x509 -noout -dates -in /etc/ssl/acme/yourdomain.com/cert.pem
# ทดสอบ HTTPS
curl -I https://yourdomain.com
# ตรวจ SSL grade
curl -s "https://api.ssllabs.com/api/v3/analyze?host=yourdomain.com&startNew=on" | python3 -m json.tool
--reloadcmd เสมอเพื่อให้ Nginx/Apache reload cert ใหม่อัตโนมัติหลัง renew โดยไม่ต้อง restart service ทั้ง process
แก้ปัญหาที่พบบ่อย
Error: "Verify error: Invalid response from"
HTTP challenge ล้มเหลว domain ต้องชี้มา VPS และ port 80 ต้องเปิด:
curl -I http://yourdomain.com/.well-known/acme-challenge/test
# ต้องได้ 404 (ดีกว่า connection refused)
sudo ufw allow 80
DNS challenge ล้มเหลว (TXT record ไม่พบ)
DNS propagation ช้า เพิ่ม delay หรือใช้ DNS provider ที่ propagate เร็ว:
acme.sh --issue -d "*.yourdomain.com" --dns dns_cf \
--dnssleep 120 # รอ 120 วินาที ก่อน verify
Certificate ไม่ renew อัตโนมัติ
ตรวจ cron job และ permission:
crontab -l | grep acme
# ถ้าไม่มี ตั้งใหม่:
acme.sh --install-cronjob
Nginx ไม่ reload cert ใหม่หลัง renew
ตรวจว่า user ที่รัน acme.sh มีสิทธิ์รัน systemctl reload nginx:
# เพิ่มใน sudoers:
echo "ubuntu ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx" | sudo tee /etc/sudoers.d/acme-nginx
คำถามที่พบบ่อย
acme.sh กับ Certbot ต่างกันอย่างไร?
Certbot เป็น official EFF client ใช้งานง่ายกว่าสำหรับมือใหม่ acme.sh เป็น shell script ที่ portable กว่า รองรับ DNS providers มากกว่า 150 ราย ไม่ต้อง install Python dependency เหมาะสำหรับ server ที่มี package จำกัดหรือต้องการ control สูง
acme.sh รองรับ ECC (ECDSA) certificate ไหม?
ได้ ใช้ --keylength ec-256 เพื่อออก ECDSA P-256 cert ที่เล็กกว่าและเร็วกว่า RSA 2048 สำหรับ modern servers และ clients
ออก cert ได้กี่ domain ต่อครั้ง?
Let's Encrypt อนุญาต 100 subdomain per certificate และ rate limit 50 certificates per domain per week acme.sh รองรับ SAN (Subject Alternative Names) ได้หลาย domain ในใบเดียวผ่าน flag -d domain1 -d domain2