สารบัญ
ทำไม SSL ถึงหมดอายุโดยไม่รู้ตัว
SSL Certificate มีอายุจำกัด — ปัจจุบัน browser รองรับสูงสุด 398 วัน (~13 เดือน) สำหรับ Commercial SSL และ 90 วันสำหรับ Let's Encrypt แต่เจ้าของเว็บจำนวนมากยังเจอปัญหา cert หมดอายุโดยไม่ตั้งใจ เพราะ:
- ลืมจดวันหมดอายุ หรือตั้ง reminder ผิดวัน
- อีเมลแจ้งเตือนจาก CA ไปตกใน Spam folder
- เปลี่ยนอีเมลผู้ดูแลแต่ไม่อัพเดตที่ CA
- ระบบ auto-renewal ตั้งไว้แล้วแต่ fail เงียบๆ เพราะ DNS เปลี่ยน
ผลคือเว็บแสดง "Your connection is not private" ผู้ใช้เห็นหน้าเตือนสีแดง ไม่กล้าเข้า ธุรกิจเสียหายทันที
สถิติน่าสนใจ: จากรายงาน Venafi (2022) กว่า 80% ของ outage ที่เกิดจาก certificate มาจากการหมดอายุโดยไม่ได้วางแผน ทั้งที่ป้องกันได้ง่ายด้วย auto-renewal
Let's Encrypt + Certbot ต่ออายุอัตโนมัติ
Let's Encrypt เป็น CA ฟรีที่นิยมที่สุด ออก cert อายุ 90 วัน Certbot คือ client ที่ IETF แนะนำ รองรับ auto-renewal แบบสมบูรณ์
ติดตั้ง Certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
# หรือผ่าน snap (recommended)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
ขอ Certificate ครั้งแรก
# สำหรับ Nginx
sudo certbot --nginx -d example.com -d www.example.com
# สำหรับ Apache
sudo certbot --apache -d example.com -d www.example.com
# Standalone (ไม่มี web server)
sudo certbot certonly --standalone -d example.com
ทดสอบ Auto-renewal
# dry-run (ไม่ได้ cert จริง — ทดสอบ config)
sudo certbot renew --dry-run
# ถ้าขึ้น "Congratulations, all simulated renewals succeeded" = ผ่าน
Certbot ติดตั้ง systemd timer หรือ cron job ให้อัตโนมัติ รันทุก 12 ชั่วโมง จะต่ออายุเมื่อเหลือน้อยกว่า 30 วัน
DirectAdmin Auto-SSL สำหรับ Hosting
ถ้าใช้ Hosting ที่รัน DirectAdmin (เช่น AsiaGB Hosting) การต่ออายุ SSL ง่ายมาก — DirectAdmin มีฟีเจอร์ Auto-SSL ในตัว
เปิดใช้ Auto-SSL ใน DirectAdmin
- Login เข้า DirectAdmin Control Panel
- ไปที่ Advanced Features → SSL Certificates
- เลือก Free & automatic certificate from Let's Encrypt
- ติ๊ก Force SSL with https redirect
- กด Save
AsiaGB Hosting: เปิด Auto-SSL ให้โดย default สำหรับทุก Domain ที่ชี้มาที่ server ถูกต้อง ไม่ต้องตั้งค่าเพิ่ม cert ต่ออายุอัตโนมัติทุก 60 วัน
ตรวจสอบสถานะ SSL ใน DirectAdmin
# ดูวันหมดอายุ cert ที่ใช้อยู่
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
ตั้ง Cron Job ต่ออายุ SSL บน VPS
บน VPS ที่จัดการเอง ควรตั้ง cron job เพิ่มเติมให้มั่นใจ แม้ Certbot จะมี timer ให้แล้ว
# เปิด crontab editor
sudo crontab -e
# เพิ่มบรรทัดนี้ (รันทุกวัน 3:30 AM)
30 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx" 2>&1 | logger -t certbot-renew
อธิบาย flags สำคัญ
| Flag | ความหมาย |
|---|---|
--quiet | ไม่แสดง output ถ้าไม่มีอะไรผิดปกติ |
--post-hook | รัน command หลังต่ออายุสำเร็จ (reload nginx) |
logger -t certbot-renew | บันทึก log เข้า syslog ไว้ตรวจสอบ |
Wildcard Certificate กับ DNS Challenge
ถ้าต้องการ Wildcard SSL (*.example.com) ต้องใช้ DNS challenge แทน HTTP challenge:
# ขอ Wildcard cert ผ่าน DNS challenge
sudo certbot certonly --manual --preferred-challenges dns \
-d "*.example.com" -d "example.com"
# สำหรับ auto-renewal ต้องใช้ DNS plugin เช่น Cloudflare
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
-d "*.example.com"
ระบบแจ้งเตือนก่อน SSL หมดอายุ
แม้จะตั้ง auto-renewal แล้ว ควรมีการ monitor แยกต่างหากเพื่อรับรู้เมื่อมีปัญหา
วิธีตรวจสอบวันหมดอายุผ่าน Command Line
# ดูวันหมดอายุ
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -enddate
# ผลตัวอย่าง: notAfter=Jan 17 12:00:00 2027 GMT
Script แจ้งเตือนอัตโนมัติ
#!/bin/bash
# ssl-check.sh — รันทุกวันผ่าน cron ส่ง email ถ้าเหลือน้อยกว่า 30 วัน
DOMAIN="example.com"
DAYS_WARN=30
ALERT_EMAIL="[email protected]"
EXPIRY=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
TODAY_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $TODAY_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt $DAYS_WARN ]; then
echo "SSL for $DOMAIN expires in $DAYS_LEFT days!" | \
mail -s "SSL ALERT: $DOMAIN expires soon" $ALERT_EMAIL
fi
เครื่องมือ Monitor ออนไลน์
| เครื่องมือ | ฟีเจอร์หลัก | ราคา |
|---|---|---|
| UptimeRobot | เช็ค SSL + uptime แจ้งเตือน email/SMS | ฟรี (พื้นฐาน) |
| SSL Labs Monitor | เช็คคะแนน SSL grade อัตโนมัติ | ฟรี |
| Freshping | Monitor ทุก 1 นาที แจ้งเตือน Slack | ฟรี 50 checks |
| Zabbix/Grafana | Enterprise monitoring ครบวงจร | Self-hosted ฟรี |
ต่ออายุ SSL แบบ Paid (Commercial)
SSL แบบ Paid เช่น RapidSSL, GeoTrust ต้องการกระบวนการ validate ใหม่ทุกรอบ แต่ยังสามารถทำ semi-auto ได้:
ขั้นตอนต่ออายุ Paid SSL
- สร้าง CSR ใหม่ บน server ก่อนหมดอายุ 30-60 วัน
- ยืนยันโดเมน ผ่าน email, DNS TXT record หรือ file upload
- ดาวน์โหลด cert ใหม่ และ install บน server
- Reload web server เพื่อใช้ cert ใหม่
# สร้าง CSR ใหม่บน server
openssl req -new -newkey rsa:2048 -nodes \
-keyout example.com.key \
-out example.com.csr \
-subj "/C=TH/ST=Bangkok/L=Bangkok/O=My Company/CN=example.com"
ราคา SSL จาก AsiaGB (ต่อปี)
| ประเภท | รุ่น | ราคา/ปี |
|---|---|---|
| DV SSL | RapidSSL | 1,000 บาท |
| DV Wildcard | RapidSSL Wildcard | 5,000 บาท |
| OV SSL | GeoTrust True BusinessID | 4,000 บาท |
| EV SSL | GeoTrust True BusinessID w/EV | 7,000 บาท |
แก้ปัญหา Auto-renewal ไม่ทำงาน
ปัญหา: certbot renew ผิดพลาด
สาเหตุที่พบบ่อยที่สุด: DNS เปลี่ยน IP แต่ A record ยังชี้ไปที่ server เก่า หรือ firewall block port 80 ที่ Let's Encrypt ใช้ validate
# ดู log certbot
sudo journalctl -u certbot -n 50
# หรือ
sudo cat /var/log/letsencrypt/letsencrypt.log | tail -50
# ตรวจ port 80 เปิดอยู่ไหม
sudo ss -tlnp | grep :80
curl -I http://example.com/.well-known/acme-challenge/test 2>&1 | head -5
ปัญหาที่พบบ่อยและวิธีแก้
| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
| Connection refused port 80 | Firewall block หรือ nginx/apache หยุด | เปิด port 80, start web server |
| Too many requests | Request เกิน rate limit ของ LE | รอ 1 ชั่วโมง หรือใช้ staging server ทดสอบ |
| DNS propagation delay | DNS ยังไม่อัพเดต | รอ 24-48h หรือตรวจด้วย dig |
| Permission denied | Certbot ไม่มีสิทธิ์เขียนไฟล์ | รัน sudo certbot หรือแก้ permission |
Checklist ป้องกัน SSL หมดอายุ
ทำตาม checklist นี้ทุก domain เพื่อป้องกัน cert หมดอายุอย่างสมบูรณ์:
| รายการ | วิธีตรวจ | สถานะ |
|---|---|---|
| Auto-renewal เปิดอยู่ | certbot renew --dry-run | ✅ บังคับ |
| Cron job ตั้งไว้ | crontab -l | grep certbot | ✅ บังคับ |
| Monitor ภายนอก | UptimeRobot หรือ SSL alert | ⚠️ แนะนำ |
| อีเมลแจ้งเตือนถูกต้อง | ตรวจที่ CA / DirectAdmin | ✅ บังคับ |
| Port 80 เปิดอยู่ | curl http://domain/.well-known/test | ✅ สำหรับ HTTP challenge |
| DNS ชี้ถูกต้อง | dig +short A example.com | ✅ บังคับ |
คำถามที่พบบ่อย
อัปเดต: 19 ต.ค. 2026 | หมวด: SSL Certificate | SSL Wildcard คืออะไร →