Nginx

Nginx SSL/TLS Advanced: OCSP Stapling, Session Tickets และ Certificate Chain

การตั้งค่า SSL/TLS ไม่ได้จบแค่การติดตั้งใบรับรอง เพื่อให้ได้ประสิทธิภาพสูงสุด ความปลอดภัยที่ดีที่สุด และความเร็วในการทำงาน คุณต้องเข้าใจเทคนิคขั้นสูงต่างๆ เช่น OCSP Stapling, Session Tickets, และการจัดการ Certificate Chain อย่างถูกต้อง ด้วยการปรับตั้งเหล่านี้ เซิร์ฟเวอร์ของคุณจะสามารถจัดการการเชื่อมต่อ HTTPS ได้อย่างมีประสิทธิภาพ และลดเวลาในการ handshake ได้อย่างมีนัยสำคัญ

บทความนี้จะอธิบายเทคนิค SSL/TLS ขั้นสูงที่ใช้ใน Nginx เพื่อให้คุณสามารถปรับปรุงความปลอดภัยและประสิทธิภาพของเว็บไซต์ได้อย่างเต็มที่ พร้อมด้วยตัวอย่าง configuration และวิธีการทดสอบที่ใช้ได้จริง

SSL/TLS Handshake คืออะไร และเกิดอะไรขึ้น

ก่อนที่จะลงลึกเข้าไปในเทคนิคขั้นสูง สำคัญที่ต้องเข้าใจขั้นตอนพื้นฐาน SSL/TLS handshake ก่อน นี่คือขั้นตอนที่เครื่องคลายเอนต์ (เบราว์เซอร์) และเซิร์ฟเวอร์ (Nginx) ทำการสร้างการเชื่อมต่อที่ปลอดภัย:

  • ClientHello: คลายเอนต์ส่งข้อมูลเกี่ยวกับ TLS version, supported ciphers, และ session ID
  • ServerHello: เซิร์ฟเวอร์เลือก TLS version, cipher suite, และส่งใบรับรอง (certificate)
  • Certificate Chain: เซิร์ฟเวอร์ส่ง certificate chain พร้อม intermediate certificates
  • Key Exchange: ทั้งฝ่ายแลกเปลี่ยน public key เพื่อคำนวณ shared secret
  • Finished: ทั้งฝ่ายตรวจสอบความถูกต้องและสร้าง encryption key เพื่อเริ่มการสื่อสารที่เข้ารหัส

ปัญหาของ handshake มาตรฐานคือกระบวนการนี้ใช้เวลาหลายสิบมิลลิวินาทีเพราะต้องมีการสื่อสารหลายครั้ง และในบางกรณี เซิร์ฟเวอร์ต้องตรวจสอบสถานะใบรับรอง (OCSP) ซึ่งเพิ่มความล่าช้าให้กับการเชื่อมต่อ

OCSP Stapling คืออะไร

OCSP (Online Certificate Status Protocol) Stapling เป็นเทคนิคที่ช่วยเร่งการตรวจสอบสถานะใบรับรอง (certificate revocation status) ดังนี้:

  • ปกติ (ไม่มี OCSP Stapling): เบราว์เซอร์จะทำการติดต่อ OCSP Responder เพื่อขอข้อมูลสถานะใบรับรอง ซึ่งใช้เวลาประมาณ 2-5 วินาทีหรือมากกว่า
  • OCSP Stapling: เซิร์ฟเวอร์จะติดต่อ OCSP Responder เพื่อขอสถานะล่วงหน้า และ “staple” (ติด) ผลลัพธ์เข้าไปในการตอบสนอง TLS ของตัวเอง ทำให้เบราว์เซอร์ไม่ต้องติดต่อ OCSP Responder เอง

ข้อดีของ OCSP Stapling:

  • ลดเวลาใน TLS Handshake ได้ 1-5 วินาทีต่อการเชื่อมต่อ
  • เพิ่มความเป็นส่วนตัว (privacy) เพราะเบราว์เซอร์ไม่ต้องบ่งบอก OCSP Responder ว่ากำลังเยี่ยมชมไซต์ใดอยู่
  • ลดการเรียกใช้ OCSP Responder ของสำนักออกใบรับรอง
  • ยังคงรักษาความปลอดภัยในการตรวจสอบสถานะใบรับรอง

ติดตั้ง OCSP Stapling บน Nginx

ขั้นตอน 1: สร้างโฟลเดอร์เก็บ OCSP Response

sudo mkdir -p /var/cache/nginx/ocsp
sudo chown www-data:www-data /var/cache/nginx/ocsp
sudo chmod 700 /var/cache/nginx/ocsp

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

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

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

    # OCSP Stapling Configuration
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_stapling_responder http://ocsp.int-x3.letsencrypt.org;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    ssl_stapling_file /var/cache/nginx/ocsp/example.com.ocsp;

    # TLS Version
    ssl_protocols TLSv1.2 TLSv1.3;

    # Ciphers
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

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

จากตัวอย่างข้างต้น:

  • ssl_stapling on; — เปิดใช้งาน OCSP Stapling
  • ssl_stapling_verify on; — เปิดใช้งานการตรวจสอบ OCSP Response
  • ssl_stapling_responder: — ที่อยู่ของ OCSP Responder (สำหรับ Let’s Encrypt คือ http://ocsp.int-x3.letsencrypt.org)
  • ssl_trusted_certificate: — เส้นทางของ Chain Certificate (ต้องมีการตั้งค่านี้เพื่อให้ OCSP Stapling ทำงาน)
  • ssl_stapling_file: — ตำแหน่งไฟล์เก็บ OCSP Response ที่แคช

ขั้นตอน 3: ตรวจสอบ Nginx Configuration

sudo nginx -t
sudo systemctl reload nginx

ทดสอบ OCSP Stapling

ใช้คำสั่ง openssl เพื่อตรวจสอบว่า OCSP Stapling ทำงานหรือไม่:

echo Q | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | grep -A5 "OCSP response"

# ผลลัพธ์ที่ต้องการ:
# OCSP response: 
# OCSP Response Status: successful (0x0)
# Certificate Status: good (0x0)

Curl ตรวจสอบเวลา TLS Handshake

curl -w "Connect time: %{time_connect}\nTLS time: %{time_appconnect}\nTotal: %{time_total}\n" -o /dev/null -s https://example.com

Session Tickets บน TLS

Session Tickets เป็นอีกหนึ่งเทคนิคที่ช่วยเร่ง TLS Connection Resumption (การเชื่อมต่อกับเซิร์ฟเวอร์ซ้ำๆ โดยข้ามการ handshake ทั้งหมด)

ขั้นตอนการทำงาน:

  • ครั้งแรกที่ผู้ใช้เชื่อมต่อ Nginx จะสร้าง Session Ticket และส่งให้เบราว์เซอร์
  • เบราว์เซอร์เก็บ Session Ticket นี้ไว้
  • ตรงครั้งถัดไปที่ผู้ใช้เข้าชมไซต์ เบราว์เซอร์จะส่ง Session Ticket กลับมายัง Nginx
  • Nginx ตรวจสอบ Ticket และ resume session ที่เก่า โดยข้ามการ handshake ที่ใช้เวลา

ตั้งค่า Session Tickets บน Nginx

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

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

    # Session Tickets Configuration
    ssl_session_cache shared:SSL:10m;  # Shared memory cache (10MB)
    ssl_session_timeout 10m;           # Cache timeout (10 minutes)
    ssl_session_tickets on;            # Enable session tickets
    ssl_session_ticket_key /etc/nginx/ticket.key;  # Session ticket key

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

คำอธิบาย:

  • ssl_session_cache: เก็บ session ใน shared memory ของ Nginx
  • ssl_session_timeout: ระยะเวลาที่ session ยังคงมีผลใช้ได้
  • ssl_session_tickets: เปิด/ปิด Session Tickets
  • ssl_session_ticket_key: ไฟล์ key สำหรับเข้ารหัส Session Tickets (สำคัญสำหรับความปลอดภัย)

สร้าง Session Ticket Key

sudo openssl rand 48 | openssl enc -base64 > /etc/nginx/ticket.key
sudo chown root:root /etc/nginx/ticket.key
sudo chmod 600 /etc/nginx/ticket.key

Certificate Chain Configuration

Certificate Chain เป็นชุดของ Certificates ที่เชื่อมโยงกันตั้งแต่ใบรับรองของคุณไปจนถึง Root Certificate ของ Certificate Authority (CA) การตั้งค่า Certificate Chain ที่ถูกต้องช่วยให้เบราว์เซอร์ต่างเชื่อถือใบรับรองของคุณ

โครงสร้าง Certificate Chain:

  • Server Certificate (Leaf): ใบรับรองของเซิร์ฟเวอร์คุณ (ของ example.com)
  • Intermediate Certificates: ใบรับรองกลาง (ลงนามโดย Intermediate CA)
  • Root Certificate: ใบรับรองราก (ลงนามโดย Root CA และมักจะติดตั้งในเบราว์เซอร์แล้ว)

ตั้งค่า Certificate Chain ใน Nginx

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

    # ใช้ fullchain.pem แทน cert.pem เพื่อรวม Intermediate Certificates
    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;
}

ตรวจสอบ Certificate Chain

# ดูข้อมูล Certificate Chain
openssl s_client -connect example.com:443 -showcerts 2>/dev/null | grep "subject="

# ผลลัพธ์ควรแสดง 3 certificates (Server + Intermediate + Root)

TLS 1.3 ที่เร็วกว่าด้วย 0-RTT (Zero Round Trip Time)

TLS 1.3 นำเสนอ 0-RTT mode ซึ่งช่วยให้ Session Resumption ทำได้ในขั้นตอนเดียวแทนต้องใช้ 2-3 ขั้นตอน

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

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

    # TLS 1.3 with 0-RTT
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
    
    # 0-RTT (Only for TLS 1.3)
    # Note: 0-RTT can pose replay attack risks, use with caution
    # ssl_early_data on;  # Nginx >= 1.15.4
}

Monitoring และ Performance Testing

ตรวจสอบ TLS Handshake Time

for i in {1..5}; do
  echo "Test $i:"
  curl -w "TLS: %{time_appconnect}s, Total: %{time_total}s\n" -o /dev/null -s https://example.com
done

ตรวจสอบ SSL Grade ด้วย online tool

เยี่ยมชม SSL Labs SSL Test เพื่อวิเคราะห์การตั้งค่า SSL/TLS ของคุณและดูผลคะแนน

สรุป

การปรับตั้ง OCSP Stapling, Session Tickets, และ Certificate Chain ที่ถูกต้องจะช่วยให้เซิร์ฟเวอร์ Nginx ของคุณมีประสิทธิภาพและความปลอดภัยสูงสุด การลดเวลา Handshake ไปจาก 1-5 วินาทีอาจดูเล็กน้อย แต่จะสะสมเมื่อมีผู้เยี่ยมชมจำนวนมากต่อวัน และเพิ่มประสิทธิภาพการทำงานของไซต์โดยรวม

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

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

หรือสำหรับผู้ที่ต้องการหลีกเลี่ยงการจัดการ Infrastructure เอง บริการ Cloud Hosting ของ DE เป็นตัวเลือกที่ยอดเยี่ยม เพราะทีมของเราจะดูแลการตั้งค่า SSL/TLS ทั้งหมดให้อย่างมีประสิทธิภาพ