ทำให้เว็บได้เกรด A+ บน SSL Labs

คุณติดตั้ง SSL แล้วแต่ตรวจที่ SSL Labs กลับได้แค่เกรด B หรือ C? คะแนนที่ดีไม่ได้มาจากแค่การมีใบเซอร์ แต่มาจากการตั้งค่า TLS ที่ถูกต้อง บทความนี้จะพาตั้งค่าทีละขั้นจนเว็บได้เกรด A+ บน SSL Labs

SSL Labs เกรด A+ คืออะไร

SSL Labs (Qualys) คือเครื่องมือฟรีที่ใช้สแกนการตั้งค่า SSL/TLS ของเซิร์ฟเวอร์แล้วให้คะแนนตั้งแต่ F ถึง A+ เกรด A+ คือคะแนนสูงสุด ซึ่งต้องผ่านเกณฑ์เรื่อง protocol, cipher, key exchange และต้องเปิด HSTS อย่างถูกต้อง การได้ A+ บ่งบอกว่าเว็บของคุณเข้ารหัสการเชื่อมต่ออย่างปลอดภัยตามมาตรฐานล่าสุด

SSL Labs ให้คะแนนจากอะไร

หลายคนเข้าใจว่าแค่ติดตั้งใบเซอร์ที่ถูกต้องก็เพียงพอ แต่จริงๆ แล้ว SSL Labs ประเมินจาก 4 หมวดหลัก แล้วเอาคะแนนต่ำสุดมากำหนดเพดานเกรด นั่นแปลว่าถ้าหมวดใดหมวดหนึ่งอ่อน คะแนนรวมจะถูกฉุดลงทันที ไม่ว่าหมวดอื่นจะดีแค่ไหน การเข้าใจว่าระบบให้น้ำหนักที่ตรงไหนช่วยให้แก้ปัญหาได้ตรงจุด

หมวดที่ระบบให้คะแนนมีดังนี้:

เมื่อทั้ง 4 หมวดผ่านระดับ A แล้ว การได้ "A+" จะเป็นโบนัสพิเศษที่ต้องเปิด HSTS เพิ่มเข้าไป — นี่คือเส้นแบ่งระหว่าง A กับ A+ ที่หลายเว็บมองข้าม

เช็กลิสต์สำหรับเกรด A+

ก่อนสแกนจริง ลองไล่ตามเช็กลิสต์นี้ทีละข้อ ถ้าครบทุกข้อโอกาสได้ A+ สูงมาก ตารางด้านล่างสรุปสิ่งที่ต้องทำพร้อมเหตุผล:

รายการ สถานะที่ต้องการ ทำไมจำเป็น
ปิด TLS 1.0 / 1.1 ปิดทั้งหมด protocol เก่ามีช่องโหว่ ถูกเลิกใช้แล้ว ฉุดคะแนนทันที
เปิด TLS 1.3 เปิด (พร้อม TLS 1.2) เร็วและปลอดภัยที่สุด ได้คะแนน protocol เต็ม
Cipher แข็งแรง AES-GCM เท่านั้น ตัด RC4/3DES/CBC อ่อนออกเพื่อกันคะแนนตก
Forward Secrecy ECDHE ถ้ากุญแจหลุดในอนาคต ทราฟฟิกเก่าจะไม่ถูกถอดรหัส
HSTS max-age ≥ 6 เดือน เงื่อนไขบังคับสำหรับเลื่อนจาก A เป็น A+
OCSP Stapling เปิด เร่งการตรวจสถานะใบเซอร์ ลด latency ตอน handshake

ขั้นที่ 1 — ปิด Protocol เก่า

เปิดเฉพาะ TLS 1.2 และ TLS 1.3 และปิด SSLv3, TLS 1.0, TLS 1.1 ทั้งหมด บน Apache (mod_ssl) ตั้งค่าดังนี้:

SSLProtocol -all +TLSv1.2 +TLSv1.3

บน Nginx ใช้:

ssl_protocols TLSv1.2 TLSv1.3;

ขั้นที่ 2 — เลือก Cipher Suite ที่แข็งแรง

ใช้ cipher แบบ Forward Secrecy (ECDHE) และปิด cipher อ่อน เช่น RC4, 3DES บน Nginx:

ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;

ขั้นที่ 3 — เปิด HSTS (หัวใจของ A+)

เพิ่ม header นี้เพื่อบังคับให้เบราว์เซอร์ใช้ HTTPS เสมอ — นี่คือสิ่งที่แยกเกรด A ออกจาก A+:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

เมื่อพร้อมแล้วสามารถลงทะเบียนใน HSTS Preload List ได้ที่ hstspreload.org

ขั้นที่ 4 — OCSP Stapling และ DH Params

เปิด OCSP Stapling เพื่อเร่งการตรวจสอบสถานะใบเซอร์ และใช้ Diffie-Hellman key ขนาด 2048 บิตขึ้นไป บน Nginx:

ssl_stapling on; ssl_stapling_verify on;

ข้อควรระวัง: ก่อนเปิด HSTS แบบ preload ต้องมั่นใจว่าทุก subdomain รองรับ HTTPS แล้ว เพราะเมื่อ preload ไปแล้วจะถอนออกยากและใช้เวลานาน

ตัวอย่าง config เปิด TLS 1.3 + HSTS (Nginx / Apache)

เพื่อให้เห็นภาพรวมว่าทุกขั้นตอนมารวมกันอย่างไร ด้านล่างคือ config ฉบับเต็มที่เปิด TLS 1.2/1.3 พร้อม cipher แข็งแรง HSTS และ OCSP Stapling ในไฟล์เดียว — สามารถนำไปปรับใช้ได้ทันที

Nginx (ภายในบล็อก server { ... } ที่ฟัง 443):

ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Apache (ภายใน <VirtualHost *:443> หรือไฟล์ ssl.conf):

SSLProtocol -all +TLSv1.2 +TLSv1.3 SSLHonorCipherOrder on SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 SSLUseStapling on SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

หลังแก้ไฟล์ config แล้วอย่าลืมทดสอบ syntax ก่อนรีโหลด เพื่อกันเซิร์ฟเวอร์ล่ม: Nginx ใช้ nginx -t แล้ว systemctl reload nginx ส่วน Apache ใช้ apachectl configtest แล้ว systemctl reload apache2 (หรือ httpd บางดิสโทร)

ข้อควรระวังก่อนเปิด HSTS Preload

HSTS Preload เป็นดาบสองคม มันบังคับให้เบราว์เซอร์ใช้ HTTPS กับโดเมนของคุณเสมอแบบ "ฝังในตัวเบราว์เซอร์" โดยไม่ต้องรอ header ครั้งแรก ซึ่งปลอดภัยมาก แต่ก็แก้ไขย้อนกลับได้ยาก ก่อนกดลงทะเบียนที่ hstspreload.org ควรตรวจสิ่งเหล่านี้ให้ครบ:

  1. ทุก subdomain (รวมที่ยังไม่ได้ใช้ในอนาคต) ต้องรองรับ HTTPS เพราะ includeSubDomains จะครอบคลุมทั้งหมด — ถ้ามี subdomain ที่ยังเป็น HTTP อยู่ ผู้ใช้จะเข้าไม่ได้เลย
  2. ใบเซอร์ของโดเมนหลักและ subdomain ทั้งหมดต้องต่ออายุอัตโนมัติได้ มิฉะนั้นเมื่อใบเซอร์หมดอายุ ผู้ใช้จะไม่มีทางข้ามคำเตือนไปได้
  3. เริ่มจาก max-age สั้นๆ ก่อน (เช่น ไม่กี่ชั่วโมง) แล้วค่อยเพิ่มเป็น 1 ปีเมื่อมั่นใจ จากนั้นจึงเติม preload เป็นขั้นสุดท้าย
  4. การถอนออกจาก preload list ใช้เวลานานหลายเดือนกว่าจะมีผลในเบราว์เซอร์ทุกตัว ดังนั้นอย่ารีบ preload ถ้ายังไม่พร้อม 100%

กล่าวง่ายๆ คือ HSTS แบบมี header อย่างเดียวก็เพียงพอสำหรับเกรด A+ แล้ว ส่วนการลงทะเบียน preload list เป็นขั้นเพิ่มเติมสำหรับเว็บที่มั่นใจว่าจะใช้ HTTPS ตลอดไปเท่านั้น

ตรวจผลด้วย SSL Labs

หลังตั้งค่าเสร็จ เข้าไปที่ ssllabs.com/ssltest ใส่ชื่อโดเมนแล้วรอผล ถ้ายังไม่ได้ A+ ระบบจะระบุชัดว่าติดข้อไหน เช่น protocol เก่ายังเปิดอยู่ หรือยังไม่มี HSTS ให้แก้ตามที่แจ้งแล้วสแกนซ้ำ

มีจุดเล็กๆ ที่ทำให้หลายเว็บงงเวลาสแกนแล้วผลไม่ตรงกับที่แก้ไป นั่นคือ SSL Labs มีระบบ cache ผลการสแกนล่าสุดไว้ ถ้าคุณเพิ่งแก้ config แล้วสแกนซ้ำทันที อาจเห็นผลเก่าค้างอยู่ ให้ติ๊กตัวเลือก "Clear cache" หรือเติม &clearCache=on ต่อท้าย URL เพื่อบังคับสแกนใหม่หมด นอกจากนี้หลังแก้ไฟล์ config ทุกครั้งต้อง reload หรือ restart เซอร์วิสเว็บก่อน ไม่เช่นนั้นค่าใหม่จะยังไม่มีผลจริงบนเซิร์ฟเวอร์

อีกเรื่องที่มักถูกมองข้ามคือเว็บที่ตั้งอยู่หลัง CDN หรือ reverse proxy (เช่น Cloudflare) การตั้งค่า TLS ที่ผู้ใช้ปลายทางเห็นจะเป็นของ edge ไม่ใช่ของเซิร์ฟเวอร์ต้นทาง ดังนั้นถ้าใช้ CDN ต้องไปปรับ TLS/HSTS ที่ฝั่ง CDN ด้วย มิฉะนั้นต่อให้แก้ที่ origin จนสมบูรณ์ คะแนนที่ SSL Labs เห็นก็จะยังเป็นค่าของ edge อยู่ดี

ดูแลให้ A+ อยู่กับเว็บไปนานๆ

การได้ A+ ครั้งแรกเป็นเพียงจุดเริ่มต้น เพราะมาตรฐานความปลอดภัยเปลี่ยนแปลงตลอดเวลา cipher ที่วันนี้ถือว่าแข็งแรงอาจถูกลดระดับในอีกไม่กี่ปี และ protocol ใหม่ๆ ก็ทยอยออกมา การรักษาเกรดให้คงที่จึงต้องตรวจซ้ำเป็นระยะ แนะนำให้ตั้งเตือนสแกน SSL Labs ทุก 3-6 เดือน หรือทุกครั้งที่อัปเกรดเซิร์ฟเวอร์

สิ่งที่ทำให้เกรดตกบ่อยที่สุดมีไม่กี่อย่าง ได้แก่ ใบเซอร์ใกล้หมดอายุแล้วลืมต่อ การอัปเดตซอฟต์แวร์เว็บเซิร์ฟเวอร์ที่รีเซ็ตค่า cipher กลับเป็นค่าเริ่มต้น และการเพิ่ม subdomain ใหม่ที่ยังไม่ได้ติดตั้ง SSL ทั้งที่เปิด HSTS includeSubDomains ไว้แล้ว การวางระบบต่ออายุใบเซอร์อัตโนมัติและจดบันทึกค่า config ที่ปรับไว้จะช่วยให้เว็บคงเกรด A+ ได้อย่างยั่งยืนโดยไม่ต้องมานั่งไล่แก้ใหม่ทุกครั้ง

คำถามที่พบบ่อย

SSL Labs เกรด A+ คืออะไร?

เกรด A+ คือคะแนนสูงสุดจาก SSL Labs (Qualys) ที่ประเมินการตั้งค่า SSL/TLS ของเซิร์ฟเวอร์ เว็บที่ได้ A+ ต้องปิด protocol เก่า เปิดเฉพาะ TLS 1.2/1.3 ใช้ cipher แข็งแรง และเปิด HSTS อย่างถูกต้อง

ต้องปิด TLS 1.0 และ 1.1 จริงไหม?

จำเป็น เพราะ TLS 1.0/1.1 มีช่องโหว่และถูกเลิกใช้แล้ว การเปิดทิ้งไว้จะทำให้คะแนนตกและเสี่ยงต่อการโจมตี ควรเปิดเฉพาะ TLS 1.2 และ 1.3 เท่านั้น

HSTS จำเป็นต่อเกรด A+ ไหม?

ใช่ การได้ A+ (ต่างจาก A) ต้องเปิด HTTP Strict Transport Security (HSTS) ด้วย header Strict-Transport-Security ที่มี max-age อย่างน้อย 6 เดือน เพื่อบังคับเบราว์เซอร์ใช้ HTTPS เสมอ

Let's Encrypt ฟรี ได้เกรด A+ ไหม?

ได้ เกรด A+ ขึ้นอยู่กับการตั้งค่า TLS ของเซิร์ฟเวอร์ ไม่ได้ขึ้นกับว่าใบเซอร์ฟรีหรือเสียเงิน ใบเซอร์ Let's Encrypt ใช้ key และ chain ที่เป็นมาตรฐานเหมือนกัน ขอเพียงคุณปิด protocol เก่า ใช้ cipher แข็งแรง และเปิด HSTS อย่างถูกต้องก็ได้ A+ ได้เช่นกัน

SSL Certificate ที่ตั้งค่าได้เกรด A+

AsiaGB จำหน่าย SSL จาก RapidSSL, DigiCert พร้อมคำแนะนำการตั้งค่า เริ่มต้น 1,000 บาท/ปี

ดูแพ็กเกจ SSL