Nginx

Wildcard SSL Certificate และ Multi-domain SSL บน Nginx

การจัดการ SSL Certificate บนเซิร์ฟเวอร์เว็บ โดยเฉพาะอย่างยิ่งเมื่อมีหลายโดเมนหรือ Subdomain นั้นถือเป็นงานสำคัญในการรักษาความปลอดภัยของเว็บไซต์ บริการ Cloud VPS ของ DE มีความยืดหยุ่นสูงในการตั้งค่า SSL Certificate แต่ผู้ดูแลระบบต้องเข้าใจความแตกต่างระหว่าง Wildcard SSL และ Multi-domain SSL (SAN) เพื่อให้สามารถเลือกใช้งานได้อย่างเหมาะสม

บทความนี้จะอธิบายรายละเอียดเกี่ยวกับ Wildcard SSL Certificate และ Multi-domain SSL บน Nginx รวมถึงวิธีการติดตั้ง การตั้งค่า SNI (Server Name Indication) การต่ออายุอัตโนมัติ และแนวทางการแก้ไขปัญหาที่พบบ่อย

Wildcard SSL Certificate คืออะไร

Wildcard SSL Certificate เป็นใบรับรองดิจิทัล (Certificate) ชนิดหนึ่งที่สามารถใช้กับโดเมนหลัก และ Subdomain ทั้งหมดในระดับแรก โดยใช้ Wildcard Character (*) ในชื่อโดเมน

ตัวอย่าง: หากออกใบ Wildcard SSL สำหรับ *.example.com ก็สามารถใช้กับ:

  • api.example.com
  • blog.example.com
  • admin.example.com
  • shop.example.com

ข้อดี:

  • ใช้ Certificate เดียวสำหรับ Subdomain ได้ไม่จำกัด
  • ราคาถูกกว่า Multi-domain SSL ในหลายกรณี
  • ลดความซับซ้อนในการจัดการ Certificate
  • เหมาะสำหรับองค์กรที่มี Subdomain มากมาย

ข้อจำกัด:

  • ไม่สามารถใช้กับ Domain root (example.com) ได้ → ต้องมี Certificate แยกหรือใช้ UCC/SAN
  • ใช้ได้เฉพาะ Subdomain ระดับแรกเท่านั้น (*.example.com ใช้ได้กับ api.example.com แต่ไม่ใช้ได้กับ v1.api.example.com)
  • ถ้า Private Key รั่วไหล ทั้ง Subdomain ทั้งหมดจะเสี่ยง

Multi-domain SSL (SAN) คืออะไร

Multi-domain SSL หรือ Subject Alternative Name (SAN) SSL เป็นใบรับรองที่สามารถครอบคลุมหลายโดเมนและ Subdomain ที่เฉพาะเจาะจง ทั้งที่ไม่จำเป็นต้องเป็น Subdomain เดียวกัน

ตัวอย่าง: Multi-domain SSL สำหรับ:

  • example.com
  • www.example.com
  • api.example.com
  • blog.example.org (โดเมนต่างกัน)
  • shop.company.net

ข้อดี:

  • สามารถครอบคลุม Domain root และ Subdomain ได้
  • สามารถใช้กับโดเมนที่ต่างกันได้
  • ความยืดหยุ่นสูงในการเลือกโดเมนที่ต้องการ
  • ใช้ Certificate เดียวแทน Certificate หลายอัน

ข้อจำกัด:

  • ราคามักแพงกว่า Wildcard SSL
  • เพิ่ม Subdomain ใหม่ → ต้องออกใบใหม่
  • จำกัดจำนวน Domain ที่สามารถเพิ่มได้ (ปกติ 2-3 โดเมน)

เปรียบเทียบ Wildcard SSL กับ Multi-domain SSL

ตารางเปรียบเทียบ:

ลักษณะ Wildcard SSL Multi-domain SSL
ครอบคลุม Subdomain ได้ (ระดับแรกเท่านั้น) เลือกได้ตามต้องการ
ครอบคลุม Domain root ไม่ได้ ได้
โดเมนที่แตกต่างกัน ไม่ได้ ได้
ราคา ถูก แพง
เพิ่ม Subdomain ใหม่ ไม่ต้อง ต้องออกใบใหม่
ความซับซ้อน ต่ำ สูง

ติดตั้ง Wildcard SSL บน Nginx

ขั้นตอนติดตั้ง Wildcard SSL บน Nginx:

ขั้นตอน 1: ออกใบ Wildcard SSL Certificate

ใช้ Certbot ของ Let’s Encrypt ออกใบ Wildcard SSL ด้วยการยืนยันตัวตนผ่าน DNS (DNS Challenge):

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

Certbot จะแสดง DNS TXT Record ที่ต้องเพิ่มลงในโดเมน โปรดจดบันทึกและเพิ่มลงใน DNS Manager

ขั้นตอน 2: ตั้งค่า Nginx Server Block

สร้างไฟล์ Nginx Configuration ใหม่:

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

และเพิ่มการตั้งค่าต่อไปนี้:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name example.com *.example.com;

    # Wildcard SSL Certificate
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL Configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Document Root
    root /var/www/example.com/html;
    index index.html index.php;

    # Logging
    access_log /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log;

    # PHP (ถ้าใช้ PHP)
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

# HTTP to HTTPS Redirect
server {
    listen 80;
    listen [::]:80;
    server_name example.com *.example.com;
    return 301 https://$server_name$request_uri;
}

ขั้นตอน 3: เปิดใช้งาน Configuration

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

ตั้งค่า Multi-domain SSL (SAN) บน Nginx

ขั้นตอน 1: ออกใบ Multi-domain SSL

sudo certbot certonly --manual --preferred-challenges=dns \
    -d "example.com" \
    -d "www.example.com" \
    -d "api.example.com" \
    -d "blog.example.org"

ขั้นตอน 2: ตั้งค่า Nginx สำหรับ Multi-domain

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # รวมโดเมนทั้งหมด
    server_name example.com www.example.com api.example.com blog.example.org;

    # Multi-domain SSL Certificate
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

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

    access_log /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log;

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Let’s Encrypt Wildcard Certificate ด้วย Certbot (DNS Challenge)

Let’s Encrypt มีการสนับสนุน Wildcard Certificate ได้เต็มที่ แต่ต้องใช้ DNS Challenge เพื่อยืนยันตัวตนเท่านั้น

ออกใบ Wildcard ผ่าน Certbot

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

Certbot จะแสดง DNS TXT Record ให้เพิ่มลงใน DNS Provider (Cloudflare, Route53, Plesk, ฯลฯ):

_acme-challenge.example.com TXT "XYZABC123..."

หลังจากเพิ่ม TXT Record แล้ว ให้รอ DNS Propagation (โดยปกติ 2-5 นาที) จากนั้นกด Enter ใน Certbot

ต่ออายุ Wildcard Certificate อัตโนมัติ

สร้าง Hook Script สำหรับ Renewal Automation:

sudo nano /etc/letsencrypt/renewal-hooks/pre/dns_hook.sh
#!/bin/bash
# DNS Update Script
echo "Updating DNS TXT Record..."
# ใช้ API ของ DNS Provider เพื่ออัพเดต TXT Record
sudo chmod +x /etc/letsencrypt/renewal-hooks/pre/dns_hook.sh
sudo certbot renew --manual --manual-auth-hook /etc/letsencrypt/renewal-hooks/pre/dns_hook.sh

สำหรับผู้ใช้ Cloudflare ให้ติดตั้ง certbot-dns-cloudflare plugin:

sudo pip install certbot-dns-cloudflare
sudo certbot certonly --dns-cloudflare -d "*.example.com" -d "example.com"

จัดการ Server Block หลายตัวกับ SSL Certificate หลายใบ

เมื่อมี Server Block หลายตัวกับ Certificate หลายใบ สามารถจัดการแบบนี้:

# Server Block 1: example.com (Wildcard)
server {
    listen 443 ssl http2;
    server_name example.com *.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    root /var/www/example.com/html;
}

# Server Block 2: company.org (Multi-domain)
server {
    listen 443 ssl http2;
    server_name company.org www.company.org api.company.org;
    ssl_certificate /etc/letsencrypt/live/company.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/company.org/privkey.pem;
    root /var/www/company.org/html;
}

# Server Block 3: shop.net (Single Domain)
server {
    listen 443 ssl http2;
    server_name shop.net www.shop.net;
    ssl_certificate /etc/letsencrypt/live/shop.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/shop.net/privkey.pem;
    root /var/www/shop.net/html;
}

ทดสอบการตั้งค่า:

sudo nginx -t
sudo systemctl reload nginx

SNI (Server Name Indication) บน Nginx

SNI (Server Name Indication) คือ TLS Extension ที่อนุญาตให้ผู้ใช้ระบุชื่อโดเมนที่ต้องการตอนการเชื่อมต่อ SSL ทำให้เซิร์ฟเวอร์เดียวสามารถจัดการหลาย Certificate ได้

ข้อดีของ SNI:

  • ไม่ต้องใช้ IP Address หลาย ตัว
  • ประหยัดทรัพยากร Server
  • จัดการ SSL Certificate หลายใบได้ง่าย

Nginx มี SNI Support ตั้งแต่เวอร์ชัน 0.5.23 เป็นต้นไป และ SNI เปิดใช้งานเป็นค่าเริ่มต้นแล้ว

ต่ออายุ SSL Certificate อัตโนมัติ

Let’s Encrypt Certificate มีอายุ 90 วัน ขอแนะนำให้ตั้งค่า Renewal Automation เพื่อต่ออายุโดยอัตโนมัติ

ตั้งค่า Cron Job สำหรับ Renewal

sudo crontab -e

เพิ่มบรรทัดต่อไปนี้:

0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

คำสั่งนี้จะตรวจสอบและต่ออายุ Certificate ทุกวันเวลา 03:00 น. หากใกล้หมดอายุแล้วจะต่อให้โดยอัตโนมัติ

ตรวจสอบสถานะ Certificate

sudo certbot certificates

คำสั่งนี้จะแสดงรายชื่อ Certificate ทั้งหมด วันที่หมดอายุ และสถานะการต่ออายุ

ข้อผิดพลาดทั่วไปและการแก้ไข

ข้อผิดพลาด 1: Certificate ไม่ตรงกับ Domain

สาเหตุ: Server Block ของ Nginx ไม่ตรงกับชื่อโดเมนใน Certificate

วิธีแก้:

# ตรวจสอบโดเมนในปัจจุบัน Certificate
openssl x509 -noout -text -in /etc/letsencrypt/live/example.com/cert.pem | grep -A2 "Subject Alternative Name"

# ตรวจสอบ Server Block
sudo nginx -T | grep -A5 "server_name"

โปรดให้แน่ใจว่า server_name ใน Nginx ตรงกับชื่อโดเมนใน Certificate

ข้อผิดพลาด 2: DNS Challenge ล้มเหลว

สาเหตุ: TXT Record ไม่ถูกเพิ่มลงใน DNS หรือยังไม่ Propagate

วิธีแก้:

# ตรวจสอบ DNS TXT Record
dig _acme-challenge.example.com TXT

# รอ DNS Propagation (เว็บไซต์ช่วย: https://mxtoolbox.com)
# จากนั้นลองใหม่

ข้อผิดพลาด 3: Mixed Content Warning

สาเหตุ: เนื้อหา HTTPS บรรจุ Resource HTTP (ไม่ปลอดภัย)

วิธีแก้:

# เพิ่มใน Nginx Config
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

หรือในการทำความเข้าใจเนื้อหา HTML ให้เปลี่ยน http:// เป็น https:// ทั้งหมด

ข้อผิดพลาด 4: Certificate Renewal ล้มเหลว

สาเหตุ: Cron Job ไม่ทำงาน หรือ DNS Hook ไม่ตั้งค่าถูกต้อง

วิธีแก้:

# ทดสอบ Manual Renewal
sudo certbot renew --dry-run

# ตรวจสอบ Cron Log
sudo grep CRON /var/log/syslog

# ตรวจสอบ Certbot Log
sudo tail -f /var/log/letsencrypt/letsencrypt.log

สรุป

Wildcard SSL Certificate และ Multi-domain SSL (SAN) เป็นสองวิธีหลักในการจัดการ SSL บนเซิร์ฟเวอร์เว็บ โดย Wildcard SSL เหมาะสำหรับ Subdomain มากมาย และราคาถูก ส่วน Multi-domain SSL เหมาะสำหรับโดเมนที่แตกต่างกันหรือต้องการ Domain root

Nginx มี SNI Support ตั้งแต่เวอร์ชันเก่าแล้ว ทำให้จัดการ SSL Certificate หลายใบได้ง่ายขึ้น และการใช้ Let’s Encrypt ด้วย Certbot ทำให้สามารถออกใบ Certificate ฟรีและต่ออายุอัตโนมัติได้อย่างสะดวก

การติดตั้ง SSL Certificate ที่ถูกต้องจะช่วยเพิ่มความปลอดภัยให้กับเว็บไซต์ และสร้างความไว้วางใจให้แก่ผู้เยี่ยมชม

แนะนำบริการ DE

หากคุณต้องการมีเซิร์ฟเวอร์เว็บที่สามารถตั้งค่า SSL Certificate ได้อย่างอิสระ และมีความยืดหยุ่นสูงในการจัดการ Nginx ขอแนะนำให้ใช้บริการ Cloud VPS ของ DE ซึ่งมีความสมรรถนะสูง เสถียร และมีค่าเสนอราคาที่แข่งขันได้

สำหรับผู้ที่ต้องการใช้เว็บไซต์โดยไม่ต้องจัดการ Infrastructure เองบริการ Cloud Hosting ของ DE ก็เป็นตัวเลือกที่ดี เพราะทีมของ DE จะดูแลการตั้งค่า SSL Certificate ให้โดยอัตโนมัติและช่วยการต่ออายุ Certificate ให้ด้วย