VPS

ติดตั้ง Let's Encrypt SSL อัตโนมัติด้วย Certbot บน VPS Nginx

📅 9 ตุลาคม 2569 ⏱ อ่าน 12 นาที 🔒 Let's Encrypt · Certbot · Nginx · Ubuntu
ติดตั้ง Let's Encrypt SSL ด้วย Certbot บน VPS Nginx อัตโนมัติ

เว็บไซต์ที่ไม่มี SSL ในปัจจุบันถือว่า "ไม่ปลอดภัย" ในสายตา Google และ Browser ทั้งหลาย ส่งผลต่อ SEO และความเชื่อมั่นผู้ใช้งาน Let's Encrypt แก้ปัญหานี้ด้วย SSL ฟรี และ Certbot ทำให้การติดตั้งและต่ออายุเป็นเรื่องอัตโนมัติบน VPS ที่ใช้ Nginx

1. Certbot และ Let's Encrypt คืออะไร

Let's Encrypt คือ Certificate Authority (CA) ไม่แสวงหากำไร ก่อตั้งโดย ISRG (Internet Security Research Group) ร่วมกับ EFF, Mozilla, Cisco และ Akamai ออก SSL/TLS Certificate ฟรี โดยใช้ ACME Protocol (Automated Certificate Management Environment)

Certbot คือ ACME client ที่ Electronic Frontier Foundation (EFF) พัฒนา ทำงานร่วมกับ Let's Encrypt โดยตรง สามารถ:

💡 ข้อมูลสำคัญ: SSL จาก Let's Encrypt มีอายุ 90 วัน แต่ Certbot จะต่ออายุอัตโนมัติทุก 60 วัน ดังนั้นเมื่อตั้งค่าแล้วไม่ต้องดูแลเพิ่มเติม

2. ข้อกำหนดก่อนติดตั้ง

รายการข้อกำหนดหมายเหตุ
OSUbuntu 20.04/22.04/24.04 หรือ Debian 11/12แนะนำ Ubuntu LTS
Web ServerNginx ติดตั้งและรันอยู่version 1.14+
โดเมนชี้ A record มาที่ IP ของ VPS แล้วต้องรอ DNS propagate
Port80 (HTTP) และ 443 (HTTPS) เปิดใน Firewallต้องการทั้งสอง port
สิทธิ์root หรือ sudo user–

ตรวจสอบว่า DNS ของโดเมนชี้มาที่ VPS แล้ว:

dig +short example.com A
# ต้องได้ IP address ของ VPS

3. ติดตั้ง Certbot บน Ubuntu/Debian

วิธีที่แนะนำคือติดตั้งผ่าน snap ซึ่ง Certbot เองก็แนะนำเพราะได้ version ล่าสุดเสมอ:

# อัพเดต package list
sudo apt update

# ติดตั้ง snap (ถ้ายังไม่มี)
sudo apt install snapd -y

# ติดตั้ง core snap และ update
sudo snap install core
sudo snap refresh core

# ติดตั้ง Certbot
sudo snap install --classic certbot

# สร้าง symlink ให้ใช้ได้จาก path ปกติ
sudo ln -s /snap/bin/certbot /usr/bin/certbot

ตรวจสอบการติดตั้ง:

certbot --version
# certbot 2.x.x
⚠️ หมายเหตุ: หากใช้ Ubuntu เก่าที่ติดตั้งผ่าน apt install certbot ไว้แล้ว แนะนำ remove ออกก่อนแล้วติดตั้งผ่าน snap ใหม่ เพื่อให้ได้ version ล่าสุด

4. ตั้งค่า Nginx ก่อนขอ Certificate

Certbot ต้องการให้ Nginx รู้จัก server_name ของโดเมนก่อน ตรวจสอบไฟล์ config:

sudo nano /etc/nginx/sites-available/example.com

ตัวอย่าง config ขั้นต้น (ก่อนติดตั้ง SSL):

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html index.php;

    location / {
        try_files $uri $uri/ =404;
    }
}

เปิดใช้งาน config และ reload Nginx:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

เปิด port ใน Firewall (UFW):

sudo ufw allow 'Nginx Full'
sudo ufw status

5. ขอ SSL Certificate

ขอ Certificate สำหรับโดเมนพร้อมให้ Certbot แก้ Nginx config อัตโนมัติ:

sudo certbot --nginx -d example.com -d www.example.com

ระบบจะถามข้อมูลบางส่วน:

  1. Email address: ใส่อีเมลสำหรับรับแจ้งเตือนเมื่อใกล้หมดอายุ
  2. Terms of Service: กด A เพื่อยอมรับ
  3. Share email กับ EFF: กด Y หรือ N ตามต้องการ
  4. Redirect HTTP → HTTPS: กด 2 เพื่อ redirect ทุก request

หลังจากนั้น Certbot จะแก้ไข Nginx config ให้ SSL ทำงานอัตโนมัติ:

# หลัง Certbot แก้ config แล้ว จะดูคล้ายนี้
server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

6. ตรวจสอบ SSL และ HTTPS Redirect

ตรวจสอบ certificate ที่ติดตั้ง:

sudo certbot certificates

ทดสอบ HTTPS redirect:

curl -I http://example.com
# ต้องได้ HTTP/1.1 301 Moved Permanently
# Location: https://example.com/

curl -I https://example.com
# ต้องได้ HTTP/2 200

ตรวจสอบคุณภาพ SSL ด้วย SSL Labs ที่ ssllabs.com/ssltest ผลลัพธ์ Let's Encrypt + Nginx ที่ตั้งค่าถูกต้องมักได้ Grade A

✅ เช็คเพิ่มเติม: ดูว่า Browser แสดง "🔒 ปลอดภัย" หรือ "Connection is secure" ที่ address bar แสดงว่า SSL ทำงานสมบูรณ์

7. ตั้งค่า Auto-Renew อัตโนมัติ

Certbot ที่ติดตั้งผ่าน snap จะตั้ง systemd timer ให้อัตโนมัติ ตรวจสอบด้วย:

sudo systemctl status snap.certbot.renew.timer

ทดสอบว่า auto-renew ทำงานได้ (dry-run ไม่กระทบ cert จริง):

sudo certbot renew --dry-run

ถ้าใช้ cron แทน systemd timer:

# เปิด crontab
sudo crontab -e

# เพิ่มบรรทัดนี้ (รันทุกวัน 00:00 และ 12:00)
0 0,12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
💡 เคล็ดลับ: ใส่ --post-hook "systemctl reload nginx" เพื่อให้ Nginx reload cert ใหม่ทันทีหลังต่ออายุสำเร็จ มิฉะนั้นต้องรอ restart ครั้งถัดไป

8. Wildcard SSL ด้วย DNS Challenge

Wildcard SSL (*.example.com) ครอบคลุมทุก subdomain แต่ต้องใช้ DNS-01 Challenge แทน HTTP-01:

sudo certbot certonly --manual --preferred-challenges dns \
  -d "example.com" -d "*.example.com"

Certbot จะขอให้เพิ่ม TXT record ใน DNS:

  1. เพิ่ม DNS TXT record: _acme-challenge.example.com → ค่าที่ Certbot กำหนด
  2. รอ DNS propagate (5–30 นาที)
  3. กด Enter เพื่อ verify
⚠️ ข้อจำกัด Wildcard: DNS challenge ต้องทำด้วยตนเองทุกครั้งที่ต่ออายุ (ทุก 60 วัน) ถ้าต้องการอัตโนมัติ ต้องใช้ DNS plugin ของ Certbot ที่รองรับ provider ของคุณ เช่น Cloudflare, Route53 เป็นต้น

9. แก้ปัญหาที่พบบ่อย

Error: Connection refused / Port 80 ปิด

sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload

Error: DNS not resolving

ต้องรอให้ DNS propagate ก่อน ทดสอบด้วย:

nslookup example.com 8.8.8.8

Error: Too many certificates

Let's Encrypt จำกัด 5 cert ต่อ domain ต่อสัปดาห์ ถ้าเจอ error นี้ให้ใช้ --staging flag เพื่อทดสอบก่อน:

sudo certbot --nginx -d example.com --staging

Certificate หมดอายุแต่ไม่ต่ออัตโนมัติ

# ตรวจสอบ log
sudo journalctl -u snap.certbot.renew.service

# ต่ออายุ manual
sudo certbot renew --force-renewal

Nginx แสดง 404 หลังติดตั้ง SSL

ตรวจสอบว่า root path ใน Nginx config ถูกต้อง และไฟล์ index.html มีอยู่จริง:

sudo nginx -t
sudo systemctl reload nginx

คำถามที่พบบ่อย (FAQ)

Certbot คืออะไร แตกต่างจาก Let's Encrypt อย่างไร?
Let's Encrypt คือ Certificate Authority (CA) ที่ออก SSL ฟรี ส่วน Certbot คือ ACME client ที่ EFF พัฒนา ช่วยติดตั้งและต่ออายุ SSL จาก Let's Encrypt บน server โดยอัตโนมัติ
SSL จาก Let's Encrypt ใช้ได้กี่วัน ต้องต่ออายุบ่อยไหม?
SSL จาก Let's Encrypt มีอายุ 90 วัน Certbot จะตั้ง systemd timer หรือ cron ต่ออายุอัตโนมัติทุก 60 วัน คุณไม่ต้องทำอะไรเพิ่มหลังตั้งค่าแล้ว
ใช้ Certbot กับ Nginx หรือ Apache ต้องต่างกันไหม?
ใช้คำสั่งต่างกัน Nginx ใช้ certbot --nginx และ Apache ใช้ certbot --apache โดย plugin แต่ละตัวจะแก้ไข config ให้อัตโนมัติ บทความนี้เน้น Nginx เป็นหลัก
ติดตั้ง SSL ด้วย Certbot ต้องเปิด port อะไรบ้าง?
ต้องเปิด port 80 (HTTP) สำหรับ ACME challenge และ port 443 (HTTPS) สำหรับ SSL ต้องตรวจสอบ Firewall (UFW หรือ iptables) ให้เปิดทั้ง 2 port ก่อน
Certbot รองรับ Wildcard SSL ได้ไหม?
รองรับ แต่ต้องใช้ DNS challenge แทน HTTP challenge ต้องมีสิทธิ์แก้ไข DNS record ของโดเมน และบาง DNS provider มี plugin สำหรับ Certbot โดยตรง
หลังติดตั้ง Certbot แล้วจะทราบได้ว่า auto-renew ทำงานหรือเปล่า?
ใช้คำสั่ง sudo certbot renew --dry-run เพื่อทดสอบการต่ออายุโดยไม่กระทบ cert จริง ถ้าผ่านโดยไม่มี error แสดงว่า auto-renew ทำงานได้ปกติ

สรุป

การติดตั้ง Let's Encrypt SSL ด้วย Certbot บน VPS Nginx ไม่ใช่เรื่องยาก ขั้นตอนหลักคือ: ติดตั้ง Certbot ผ่าน snap → ตั้งค่า Nginx server_name → รัน certbot --nginx → ทดสอบ auto-renew ด้วย --dry-run เพียงเท่านี้เว็บไซต์บน VPS ของคุณก็มี HTTPS ฟรีตลอดไป

ต้องการ VPS พร้อมใช้งาน ราคาเริ่มต้น 500 บาท/เดือน?

AsiaGB.com มี VPS ไทย สิงคโปร์ และ OVHcloud Oregon ด้วย SSD storage และ Uptime 99%

ดู VPS แพ็กเกจ →