คำตอบสั้น ๆ: ขอใบรับรอง SSL ฟรีจาก Let's Encrypt ด้วย Certbot ให้ Nginx ใช้งาน HTTPS ได้ พร้อมตั้งค่าต่ออายุอัตโนมัติและทดสอบก่อนใบหมดอายุ
คู่มือนี้อธิบาย Certbot ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Let's Encrypt เป็นหน่วยงานออกใบรับรอง SSL/TLS ที่ให้บริการฟรี ใบรับรองแต่ละใบมีอายุ 90 วัน จึงต้องต่ออายุอัตโนมัติ ซึ่งเครื่องมือ Certbot จัดการให้ได้ทั้งการขอใบรับรอง การแก้ไขไฟล์ตั้งค่า Nginx ให้ใช้ HTTPS และการต่ออายุตามกำหนด
คู่มือนี้เหมาะกับเซิร์ฟเวอร์ที่ติดตั้ง Nginx และมีเว็บไซต์ตอบสนองผ่าน HTTP ได้แล้ว หากยังไม่ได้ติดตั้ง ดูได้ที่ ติดตั้ง Nginx, PHP-FPM และ MariaDB (LEMP) บน Ubuntu สำหรับผู้ใช้ Plesk มีคู่มือแยกที่ วิธีการติดตั้ง SSL by Let's Encryption บน Plesk ฟรี
สิ่งที่ต้องเตรียม
- เซิร์ฟเวอร์ Ubuntu 22.04/24.04 หรือ AlmaLinux/Rocky Linux 8-9 ที่ติดตั้ง Nginx แล้ว
- ผู้ใช้ที่มีสิทธิ์
sudo - โดเมนที่ A Record (และ AAAA Record ถ้ามี) ชี้มายัง IP ของเซิร์ฟเวอร์นี้แล้ว ทั้ง
example.comและwww.example.com - พอร์ต 80 และ 443 เปิดจากอินเทอร์เน็ต เพราะ Let's Encrypt ต้องเข้ามาตรวจสอบผ่านพอร์ต 80
- ไฟล์ตั้งค่า Nginx ที่มีบรรทัด
server_name example.com www.example.com;ตรงกับโดเมนที่จะขอใบรับรอง
ขั้นตอนที่ 1: ตรวจสอบ DNS และ Firewall
ตรวจว่าโดเมนชี้มาถูก IP แล้ว (วิธีใช้คำสั่งเพิ่มเติมดูที่ ตรวจสอบ DNS ด้วย nslookup และ dig)
dig +short example.com
dig +short www.example.comผลลัพธ์ต้องเป็น IP ของเซิร์ฟเวอร์นี้ จากนั้นเปิดพอร์ตใน Firewall ของเครื่อง
สำหรับ Ubuntu ที่ใช้ UFW
sudo ufw allow 'Nginx Full'สำหรับ AlmaLinux หรือ Rocky Linux ที่ใช้ firewalld
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reloadหากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ตนั้นเพิ่มด้วย
ขั้นตอนที่ 2: ติดตั้ง Certbot
Ubuntu
วิธีที่โครงการ Certbot แนะนำคือติดตั้งผ่าน snap ซึ่งจะได้เวอร์ชันล่าสุดเสมอ
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbotหากไม่ต้องการใช้ snap สามารถติดตั้งจาก apt ได้ด้วย sudo apt install certbot python3-certbot-nginx อย่าติดตั้งทั้งสองแบบพร้อมกัน
AlmaLinux และ Rocky Linux
Certbot อยู่ใน EPEL Repository
sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginxตรวจสอบการติดตั้งด้วย certbot --version
ขั้นตอนที่ 3: ขอใบรับรองและตั้งค่า Nginx อัตโนมัติ
sudo certbot --nginx -d example.com -d www.example.comครั้งแรก Certbot จะถาม
- อีเมลสำหรับติดต่อเรื่องสำคัญของบัญชี
- การยอมรับ Terms of Service (ตอบ
Y) - การรับข่าวสารจาก EFF (ตอบตามต้องการ)
เมื่อสำเร็จจะเห็นข้อความประมาณนี้
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
...
Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/example.com
Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.comCertbot จะเพิ่ม listen 443 ssl และตำแหน่งไฟล์ใบรับรองลงในไฟล์ตั้งค่าของ Nginx ให้ รวมถึงเพิ่มการ Redirect จาก HTTP ไป HTTPS Certbot เวอร์ชันปัจจุบันตั้งค่า Redirect ให้เป็นค่าเริ่มต้น ส่วนเวอร์ชันเก่าบางรุ่นจะถามก่อน หากต้องการระบุให้ชัดเจนให้เติม --redirect ต่อท้ายคำสั่ง
หมายเหตุ: ถ้าต้องการเพียงใบรับรองโดยไม่ให้ Certbot แก้ไฟล์ Nginx ให้ใช้
sudo certbot certonly --nginx -d example.comแล้วเพิ่มบรรทัดssl_certificateและssl_certificate_keyเอง