การใช้ Certbot ออก SSL Certificate บน Ubuntu

การใช้ Certbot ออก SSL Certificate บน Ubuntu

เว็บมี Domain แล้ว แต่ยังไม่มี HTTPS

หลังจากเราติดตั้ง Web Server บน Ubuntu และผูก Domain เรียบร้อยแล้ว ขั้นตอนสำคัญถัดไปคือการเปิดใช้งาน HTTPS เพื่อให้ผู้ใช้เห็นรูปแม่กุญแจบน Browser และเชื่อมต่อกับเว็บไซต์ผ่านการเข้ารหัส

ปัจจุบันการออก SSL/TLS Certificate ไม่จำเป็นต้องซื้อใบรับรองราคาแพงเสมอไป เพราะ Let’s Encrypt เป็น Certificate Authority ที่ให้บริการ TLS Certificate ฟรี เพื่อช่วยให้เว็บไซต์เปิดใช้งาน HTTPS ได้ง่ายขึ้นและปลอดภัยขึ้น

บทความนี้จะพาใช้งาน Certbot บน Ubuntu Server 26.04 เพื่อออก SSL Certificate จาก Let’s Encrypt ทั้งสำหรับ Nginx และ Apache พร้อมทดสอบการต่ออายุอัตโนมัติ เพื่อให้เหมาะกับการใช้งานจริงบน Production Server


สิ่งที่ต้องมีก่อนเริ่ม

บทความนี้ทดสอบบนสภาพแวดล้อมดังนี้

  • OS: Ubuntu Server 26.04

  • Web Server: Nginx หรือ Apache

  • Domain: มีชื่อโดเมนจริง เช่น example.com

  • DNS: ชี้ A Record มายัง Public IP ของ Server แล้ว

  • Firewall: เปิด Port 80 และ 443

  • User: ใช้บัญชีที่มีสิทธิ์ sudo

ตรวจสอบข้อมูลพื้นฐานของระบบก่อนเริ่ม

# ตรวจสอบเวอร์ชัน Ubuntu
lsb_release -a

# ตรวจสอบ IP ของเครื่อง
hostname -I

# ตรวจสอบสถานะ firewall
sudo ufw status

สำหรับวิธี certbot --nginx, certbot --apache และ certbot --webroot เครื่อง Server ต้องมีเว็บไซต์ที่เข้าถึงได้ผ่าน HTTP บน Port 80 อยู่ก่อน ส่วนการใช้ DNS validation ไม่จำเป็นต้องเปิด Port 80 เพราะยืนยันสิทธิ์ผ่าน DNS Record แทน


ภาพรวมการทำงานของ Certbot

Certbot คือเครื่องมือแบบ Command Line ที่ช่วยจัดการกระบวนการออก Certificate จาก Let’s Encrypt โดยอัตโนมัติ ตั้งแต่การยืนยันความเป็นเจ้าของ Domain ไปจนถึงการแก้ไขค่า Web Server ให้รองรับ HTTPS

ภาพรวมการทำงานมีลำดับประมาณนี้

User Request
    ↓
Certbot
    ↓
Let's Encrypt Validation
    ↓
Issue SSL/TLS Certificate
    ↓
Install Certificate to Nginx/Apache
    ↓
Enable HTTPS
    ↓
Auto Renew

Certbot สามารถทำงานได้หลายโหมด เช่น

  • --nginx สำหรับออก Certificate และปรับ Nginx ให้อัตโนมัติ

  • --apache สำหรับออก Certificate และปรับ Apache ให้อัตโนมัติ

  • certonly --webroot สำหรับออก Certificate อย่างเดียว โดยไม่แก้ Web Server config

  • certonly --standalone สำหรับเครื่องที่ยังไม่มี Web Server ทำงานอยู่

  • dns-01 สำหรับ Wildcard Certificate เช่น *.example.com


ขั้นตอนที่ 1: ตรวจสอบ DNS ก่อนออก Certificate

ก่อนใช้ Certbot ต้องแน่ใจก่อนว่า Domain ชี้มายัง Server ถูกต้อง

ติดตั้งเครื่องมือ DNS utility

# ติดตั้งเครื่องมือ dig สำหรับตรวจสอบ DNS
sudo apt update
sudo apt install -y dnsutils

ตรวจสอบ A Record

# ตรวจสอบว่า example.com ชี้ไป IP ใด
dig +short example.com

# ตรวจสอบ www.example.com
dig +short www.example.com

ตรวจสอบ Public IP ของ Server

# ดู Public IP จากภายนอก
curl -4 ifconfig.me

ผลลัพธ์ของ dig +short example.com ควรตรงกับ Public IP ของ Server หากยังไม่ตรง ให้กลับไปแก้ DNS ที่ผู้ให้บริการ Domain ก่อน

แนะนำ Screenshot:

  • หน้า DNS Management ของ Domain

  • ผลลัพธ์ dig +short example.com

  • ผลลัพธ์ curl -4 ifconfig.me


ขั้นตอนที่ 2: เปิด Firewall สำหรับ HTTP และ HTTPS

ถ้าใช้ UFW ให้เปิด Port 80 และ 443

# อนุญาต HTTP
sudo ufw allow 80/tcp

# อนุญาต HTTPS
sudo ufw allow 443/tcp

# ตรวจสอบสถานะ firewall
sudo ufw status numbered

หรือถ้าใช้ Nginx profile

# เปิดทั้ง HTTP และ HTTPS สำหรับ Nginx
sudo ufw allow 'Nginx Full'

สำหรับ Apache

# เปิดทั้ง HTTP และ HTTPS สำหรับ Apache
sudo ufw allow 'Apache Full'

⚠️ คำเตือน: หาก Server อยู่บน Cloud เช่น AWS, Google Cloud, Azure, DigitalOcean, Vultr หรือผู้ให้บริการ Cloud ในไทย ต้องตรวจสอบ Security Group / Firewall ฝั่ง Cloud ด้วย เพราะเปิด UFW อย่างเดียวอาจยังไม่พอ


ขั้นตอนที่ 3: ติดตั้ง Certbot ด้วย Snap

แนวทางที่ Certbot แนะนำสำหรับผู้ใช้ทั่วไปคือการติดตั้งผ่าน snap เพราะจัดการ dependency และอัปเดตได้สะดวก โดยเอกสารทางการของ Certbot ระบุให้ติดตั้งด้วย sudo snap install --classic certbot และสร้าง symbolic link ไปยังคำสั่ง certbot

เริ่มจากอัปเดตระบบ

# อัปเดต package index
sudo apt update

# อัปเกรด package ที่จำเป็น
sudo apt upgrade -y

ติดตั้ง Snapd

# ติดตั้ง snapd
sudo apt install -y snapd

# เปิดใช้งาน socket ของ snapd
sudo systemctl enable --now snapd.socket

ลบ Certbot ที่เคยติดตั้งผ่าน apt เพื่อลดความสับสนของ binary path

# ลบ certbot จาก apt หากเคยติดตั้งไว้
sudo apt remove -y certbot python3-certbot-nginx python3-certbot-apache

ติดตั้ง Certbot ผ่าน Snap

# ติดตั้ง certbot แบบ classic confinement
sudo snap install --classic certbot

สร้าง symbolic link

# ทำให้เรียกคำสั่ง certbot ได้จาก /usr/local/bin
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot

ตรวจสอบเวอร์ชัน

# ตรวจสอบ Certbot version
certbot --version

แนะนำ Screenshot:

  • ผลลัพธ์หลังติดตั้ง Certbot

  • ผลลัพธ์ certbot --version


ขั้นตอนที่ 4: เตรียมเว็บไซต์บน Nginx

ตัวอย่างนี้ใช้ Domain

example.com
www.example.com

สร้างโฟลเดอร์เว็บไซต์

# สร้าง directory สำหรับเว็บไซต์
sudo mkdir -p /var/www/example.com/html

# กำหนดสิทธิ์ให้ user ปัจจุบันจัดการไฟล์ได้
sudo chown -R $USER:$USER /var/www/example.com/html

สร้างหน้าเว็บทดสอบ

# สร้างไฟล์ index.html สำหรับทดสอบ
cat > /var/www/example.com/html/index.html <<'EOF'
<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <title>Certbot Test</title>
</head>
<body>
    <h1>Certbot SSL Test on Ubuntu</h1>
    <p>เว็บไซต์นี้พร้อมสำหรับการออก SSL Certificate</p>
</body>
</html>
EOF

สร้าง Nginx Server Block

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

ใส่ค่าเบื้องต้น

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

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

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

เปิดใช้งาน Site

# สร้าง symbolic link ไปยัง sites-enabled
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# ทดสอบ syntax
sudo nginx -t

# reload nginx
sudo systemctl reload nginx

ทดสอบเปิดเว็บผ่าน HTTP

curl -I http://example.com

ควรเห็นสถานะประมาณนี้

HTTP/1.1 200 OK
Server: nginx

ขั้นตอนที่ 5: ออก SSL Certificate สำหรับ Nginx

ใช้คำสั่งนี้เพื่อให้ Certbot ออก Certificate และปรับ Nginx configuration ให้อัตโนมัติ

# ออก SSL Certificate สำหรับ example.com และ www.example.com
sudo certbot --nginx -d example.com -d www.example.com

ระหว่างการทำงาน Certbot อาจถามข้อมูล เช่น

  • Email สำหรับแจ้งเตือน

  • ยอมรับ Terms of Service

  • ต้องการ Redirect HTTP ไป HTTPS หรือไม่

ใน Production แนะนำให้เลือก Redirect HTTP ไป HTTPS เพื่อให้ผู้ใช้เข้าเว็บผ่าน HTTPS เสมอ

หลังทำสำเร็จ ให้ทดสอบ

# ทดสอบ HTTPS header
curl -I https://example.com

ควรเห็นผลลัพธ์ประมาณนี้

HTTP/2 200
server: nginx

ตรวจสอบไฟล์ Certificate

# แสดงรายการ certificate ที่ Certbot จัดการ
sudo certbot certificates

ตำแหน่งไฟล์หลักจะอยู่ที่

/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

⚠️ คำเตือน: ห้าม copy หรือเผยแพร่ไฟล์ privkey.pem เพราะเป็น Private Key ของเว็บไซต์ หากรั่วไหลควร revoke และออก Certificate ใหม่ทันที


ขั้นตอนที่ 6: ออก SSL Certificate สำหรับ Apache

ถ้าใช้ Apache ให้ตรวจสอบว่า VirtualHost ทำงานบน Port 80 แล้ว

เปิด Module ที่จำเป็น

# เปิด SSL module
sudo a2enmod ssl

# เปิด rewrite module สำหรับ redirect
sudo a2enmod rewrite

# เปิด headers module สำหรับ security header ในอนาคต
sudo a2enmod headers

# reload apache
sudo systemctl reload apache2

ตัวอย่าง VirtualHost บน Port 80

sudo nano /etc/apache2/sites-available/example.com.conf

ใส่ค่า

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/example.com/html

    <Directory /var/www/example.com/html>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

เปิดใช้งาน Site

# enable site
sudo a2ensite example.com.conf

# ทดสอบ config
sudo apachectl configtest

# reload apache
sudo systemctl reload apache2

ออก Certificate ด้วย Certbot

# ออก SSL Certificate สำหรับ Apache
sudo certbot --apache -d example.com -d www.example.com

ตรวจสอบผล

curl -I https://example.com

ควรเห็นสถานะ 200 OK หรือ 301/302 ตาม configuration ของเว็บไซต์


ขั้นตอนที่ 7: ใช้ Webroot Mode สำหรับคนที่ไม่อยากให้ Certbot แก้ Config

บางกรณี SysAdmin อาจไม่ต้องการให้ Certbot แก้ Nginx/Apache configuration อัตโนมัติ เช่น Production Server ที่มีโครงสร้างซับซ้อน หรือใช้ Reverse Proxy หลายชั้น

ให้ใช้โหมด certonly --webroot

# ออก certificate โดยใช้ webroot
sudo certbot certonly --webroot \
  -w /var/www/example.com/html \
  -d example.com \
  -d www.example.com

หลังจากได้ Certificate แล้ว ให้นำ path ไปใส่ใน Web Server config เอง

ตัวอย่าง Nginx SSL Config

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

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

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

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

เพิ่ม HTTP to HTTPS Redirect

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

    return 301 https://$host$request_uri;
}

ทดสอบและ Reload

sudo nginx -t
sudo systemctl reload nginx

ขั้นตอนที่ 8: ตรวจสอบ Certificate ด้วย OpenSSL

ตรวจสอบผู้ออกใบรับรองและวันหมดอายุ

# ตรวจสอบ certificate จาก server จริง
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -issuer -subject -dates

ตัวอย่างผลลัพธ์

issuer=C = US, O = Let's Encrypt, CN = E7
subject=CN = example.com
notBefore=Jul  2 00:00:00 2026 GMT
notAfter=Sep 30 23:59:59 2026 GMT

ตรวจสอบ TLS Handshake

# ทดสอบ TLS 1.2
openssl s_client -connect example.com:443 -servername example.com -tls1_2

# ทดสอบ TLS 1.3
openssl s_client -connect example.com:443 -servername example.com -tls1_3

ขั้นตอนที่ 9: ทดสอบ Auto Renew

Certbot ที่ติดตั้งในระบบจะมี cron job หรือ systemd timer สำหรับต่ออายุ Certificate อัตโนมัติก่อนหมดอายุ และเอกสารทางการแนะนำให้ทดสอบด้วยคำสั่ง sudo certbot renew --dry-run

ทดสอบ Auto Renew

# ทดสอบระบบต่ออายุ certificate โดยยังไม่ต่ออายุจริง
sudo certbot renew --dry-run

ถ้าทำงานถูกต้อง ควรเห็นข้อความประมาณนี้

Congratulations, all simulated renewals succeeded

ตรวจสอบ Timer

# ดู timer ที่เกี่ยวข้องกับ certbot
systemctl list-timers | grep certbot

ในกรณีติดตั้งผ่าน Snap อาจตรวจสอบด้วย

# ตรวจสอบ service/timer ของ snap certbot
systemctl list-timers | grep snap

เพิ่ม Deploy Hook เพื่อ Reload Web Server หลัง Renew

สำหรับ Nginx

# สร้าง deploy hook สำหรับ reload nginx หลังต่ออายุ certificate
sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy

sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

ใส่คำสั่ง

#!/bin/bash
# Reload Nginx หลัง certificate renew สำเร็จ
systemctl reload nginx

กำหนดสิทธิ์ให้รันได้

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

สำหรับ Apache

sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-apache.sh

ใส่คำสั่ง

#!/bin/bash
# Reload Apache หลัง certificate renew สำเร็จ
systemctl reload apache2

กำหนดสิทธิ์

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-apache.sh

ขั้นตอนที่ 10: ตรวจสอบด้วย SSL Labs

หลังจากติดตั้ง SSL เรียบร้อยแล้ว ควรตรวจสอบด้วยเครื่องมือภายนอก เช่น SSL Labs SSL Server Test เพื่อดูว่า Certificate Chain, Protocol, Cipher Suite และ HTTPS configuration ถูกต้องหรือไม่

สิ่งที่ควรตรวจสอบ:

[ ] Certificate ถูกต้อง
[ ] Chain สมบูรณ์
[ ] Domain ตรงกับ Certificate
[ ] ไม่มี Mixed Content
[ ] Redirect HTTP ไป HTTPS ได้
[ ] รองรับ TLS 1.2 และ TLS 1.3
[ ] ไม่มี TLS 1.0 / TLS 1.1
[ ] คะแนนรวมอยู่ระดับ A หรือ A+

แนะนำ Screenshot:

  • หน้า Browser ที่แสดง HTTPS

  • หน้า Certificate Viewer ของ Browser

  • ผลทดสอบ SSL Labs


การออก Wildcard Certificate

Wildcard Certificate เช่น

*.example.com

ไม่สามารถยืนยันด้วย HTTP-01 Challenge แบบปกติได้ ต้องใช้ DNS-01 Challenge โดย Certbot จะให้สร้าง TXT Record ใน DNS หรือใช้ DNS Plugin ของผู้ให้บริการที่รองรับ

ตัวอย่างคำสั่งแบบ Manual DNS

# ขอ wildcard certificate ด้วย DNS challenge
sudo certbot certonly --manual \
  --preferred-challenges dns \
  -d example.com \
  -d "*.example.com"

Certbot จะแสดงค่า TXT Record ประมาณนี้

_acme-challenge.example.com

ให้นำค่า TXT ไปเพิ่มที่ DNS Provider จากนั้นรอ DNS กระจายตัว แล้วกด Enter เพื่อให้ Certbot ตรวจสอบ

⚠️ คำเตือน: โหมด Manual DNS ไม่เหมาะกับ Production ที่ต้องการ Auto Renew เพราะทุกครั้งที่ต่ออายุอาจต้องเพิ่ม TXT Record เอง ควรใช้ DNS Plugin ที่รองรับ API หากต้องการ Wildcard Certificate แบบต่ออายุอัตโนมัติ


Rate Limit ที่ควรรู้

Let’s Encrypt มี Rate Limit เพื่อป้องกันการออก Certificate ซ้ำจำนวนมากเกินไป โดยเอกสารทางการระบุว่าแต่ละ account สร้าง new orders ได้สูงสุด 300 orders ต่อ 3 ชั่วโมง และสามารถออก Certificate ได้สูงสุด 50 certificates ต่อ registered domain ภายใน 7 วัน

อีกข้อที่เจอบ่อยคือ “Exact Set of Identifiers” เช่น ขอใบรับรองชุดเดิมซ้ำสำหรับ example.com และ www.example.com ระบบจำกัดไว้ที่ 5 certificates ต่อ 7 วัน สำหรับชุดชื่อเดียวกัน

แนวทางลดปัญหา Rate Limit:

[ ] อย่าลบ /etc/letsencrypt โดยไม่จำเป็น
[ ] อย่ารัน certbot ซ้ำหลายครั้งขณะ troubleshoot
[ ] ใช้ --dry-run เพื่อทดสอบ renewal
[ ] ใช้ --staging เมื่อต้องทดลองหลายรอบ
[ ] รวม domain ที่จำเป็นไว้ใน certificate เดียวอย่างเหมาะสม

ตัวอย่างการใช้ Staging

# ทดสอบกับ staging environment ก่อนออก certificate จริง
sudo certbot --nginx --staging -d example.com -d www.example.com

⚠️ คำเตือน: Certificate จาก Staging จะไม่ถูก Browser เชื่อถือ ใช้เพื่อทดสอบเท่านั้น


Troubleshooting ที่พบบ่อย

1. DNS ยังไม่ชี้มาที่ Server

ตรวจสอบด้วย

dig +short example.com
curl -4 ifconfig.me

ถ้า IP ไม่ตรงกัน ให้แก้ A Record ที่ DNS Provider และรอ propagation


2. Port 80 ถูก Block

ตรวจสอบว่า Web Server รับ Port 80 หรือไม่

sudo ss -tulpn | grep ':80'

ตรวจสอบ Firewall

sudo ufw status

ตรวจสอบจากภายนอก

curl -I http://example.com

ถ้าอยู่หลัง Cloud Firewall ต้องเปิด Port 80 ที่ Cloud Console ด้วย


3. Nginx Config ผิดหลัง Certbot แก้ไฟล์

# ตรวจสอบ syntax
sudo nginx -t

# ดู log
sudo journalctl -u nginx --no-pager -n 50

ถ้าแก้ไม่ได้ ให้ตรวจสอบไฟล์ใน

/etc/nginx/sites-available/
/etc/nginx/sites-enabled/

4. Apache Config ผิดหลังออก SSL

# ตรวจสอบ syntax apache
sudo apachectl configtest

# ดู log apache
sudo journalctl -u apache2 --no-pager -n 50

ตรวจสอบว่าเปิด module แล้วหรือยัง

sudo a2enmod ssl rewrite headers
sudo systemctl reload apache2

5. ต่ออายุ Certificate ไม่ผ่าน

ดู Log ของ Certbot

sudo less /var/log/letsencrypt/letsencrypt.log

ทดสอบใหม่แบบ Dry Run

sudo certbot renew --dry-run

สาเหตุที่พบบ่อย:

[ ] DNS เปลี่ยนไปชี้ผิดเครื่อง
[ ] Port 80 ถูกปิด
[ ] Firewall ฝั่ง Cloud Block
[ ] Webroot path เปลี่ยน
[ ] Nginx/Apache config reload ไม่ผ่าน
[ ] ลบไฟล์ใน /etc/letsencrypt ผิดพลาด

Checklist หลังติดตั้ง SSL

[ ] Domain ชี้มายัง Server ถูกต้อง
[ ] Port 80 เปิดใช้งาน
[ ] Port 443 เปิดใช้งาน
[ ] Nginx/Apache ทำงานปกติ
[ ] Certbot ติดตั้งผ่าน Snap
[ ] ออก Certificate สำเร็จ
[ ] HTTPS เปิดได้จาก Browser
[ ] HTTP Redirect ไป HTTPS
[ ] certbot certificates แสดงข้อมูลถูกต้อง
[ ] certbot renew --dry-run สำเร็จ
[ ] Web Server reload หลัง renew ได้
[ ] ตรวจสอบด้วย SSL Labs แล้ว

สรุป

Certbot เป็นเครื่องมือสำคัญสำหรับผู้ดูแลระบบที่ต้องการเปิดใช้งาน HTTPS บน Ubuntu Server โดยไม่ต้องจัดการขั้นตอนออก Certificate ด้วยตนเองทั้งหมด จุดเด่นคือใช้งานง่าย รองรับ Nginx และ Apache โดยตรง และมีระบบต่ออายุ Certificate อัตโนมัติ

สำหรับเว็บไซต์ทั่วไป แนะนำให้เริ่มจาก sudo certbot --nginx หรือ sudo certbot --apache เพราะสะดวกและลดความผิดพลาด แต่ถ้าเป็น Production Server ที่มี configuration ซับซ้อน ควรใช้ certonly --webroot แล้วแก้ Web Server config เอง เพื่อควบคุมรายละเอียดได้มากขึ้น

หลังจากออก SSL Certificate สำเร็จแล้ว ขั้นตอนถัดไปที่ควรทำคือ Harden SSL/TLS เช่น ปิด TLS เวอร์ชันเก่า เปิด TLS 1.3 ตั้งค่า Security Headers และตรวจสอบคะแนนด้วย SSL Labs เพื่อให้เว็บไซต์ปลอดภัยขึ้นในระดับ Production



Write by Dr.Arnut Ruttanatirakul
SysAdmin Knowledge
https://www.sysadmin.in.th
July 2, 2026