เว็บมี 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
