การตั้งค่า 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 ทั้งหมดให้อย่างมีประสิทธิภาพ

