ตั้งค่า HSTS Header ผ่าน cPanel เพิ่มความปลอดภัย SSL

ปกป้องเว็บไซต์ของคุณจากการ SSL Stripping ด้วยการเปิดใช้งาน HSTS ผ่าน cPanel อย่างปลอดภัยและถูกต้อง

HSTS SSL Security ป้องกัน SSL Stripping Security

HSTS (HTTP Strict Transport Security) คืออะไร?

HSTS หรือ HTTP Strict Transport Security คือ Security Header ที่บอกเบราว์เซอร์ของผู้เยี่ยมชมให้ "จดจำเว็บไซต์นี้ไว้" และเข้าผ่าน HTTPS เท่านั้น ห้ามกลับมาใช้ HTTP อีก HSTS ทำงานผ่านการส่งส่วนหัว HTTP (HTTP Header) ชื่อ Strict-Transport-Security จากเซิร์ฟเวอร์ของคุณไปยังเบราว์เซอร์ เมื่อเบราว์เซอร์ได้รับ Header นี้ มันจะจดจำและบังคับให้การเชื่อมต่อทั้งหมดกับเว็บไซต์ของคุณผ่านทาง HTTPS เท่านั้น แม้ว่าผู้ใช้จะพยายามเข้าผ่าน HTTP ก็ตาม

ตัวอย่าง Header HSTS ที่เบราว์เซอร์จะได้รับ:

Strict-Transport-Security: max-age=31536000; includeSubDomains

ส่วนประกอบของ Header นี้:

ทำไม HSTS จึงมีความสำคัญต่อความปลอดภัย?

เมื่อผู้ใช้เข้าเยี่ยมชมเว็บไซต์ของคุณเป็นครั้งแรก การร้องขอมักจะเป็น HTTP (ไม่เข้ารหัส) แล้วเซิร์ฟเวอร์จึงส่ง Redirect (30x) ให้กลับมาใช้ HTTPS แต่ในช่วงเวลาเล็ก ๆ ของการร้องขอ HTTP ครั้งแรกนี้ ผู้โจมตีอาจจะดักฟังและโจมตีแบบ SSL Stripping โดยพยายามข้ามการ Redirect เพื่อให้การเชื่อมต่อยังคงเป็น HTTP ไม่ได้เป็นการเข้ารหัส ผู้โจมตีจึงสามารถดูรหัสผ่าน ข้อมูลบัญชี หรือข้อมูลอื่น ๆ ที่ส่งผ่านการเชื่อมต่อนั้นได้

HSTS แก้ปัญหานี้ได้โดย:

ข้อกำหนดเบื้องต้นก่อนเปิดใช้งาน HSTS

คำเตือนสำคัญ: ก่อนเปิดใช้งาน HSTS คุณต้องตรวจสอบให้แน่ใจว่า SSL Certificate ทำงานได้อย่างถูกต้องบนโดเมนของคุณทั้งหมด ถ้า HSTS ถูกเปิดใช้งานบนเว็บไซต์ที่ SSL ยังไม่เสถียร ผู้เยี่ยมชมอาจจะไม่เข้าถึงเว็บไซต์ได้เลยเป็นช่วงเวลาหนึ่ง ดังนั้น ก่อนเปิดใช้งาน HSTS ตรวจสอบประเด็นต่อไปนี้:

วิธีเปิดใช้งาน HSTS ผ่าน cPanel

cPanel มีวิธีการจัดการ HSTS ทั้งแบบ GUI (ถ้า Hosting Provider รองรับ) และแบบ Manual ผ่าน .htaccess ซึ่งใช้งานได้ทั่วไป

วิธีที่ 1: ผ่าน cPanel GUI (ถ้ามี)

Hosting Provider บางแห่งติดตั้ง WHM/cPanel รุ่นใหม่ที่มี HSTS Management ในส่วนของ SSL/TLS Options ขั้นตอน:

  1. Login เข้า cPanel ที่ https://yourdomain.com:2083
  2. มองหาส่วน Domains หรือ SSL/TLS
  3. หากมี HSTS Settings หรือ Manage HSTS ให้คลิกที่นั่น
  4. เลือกโดเมนที่ต้องการเปิด HSTS
  5. ตั้งค่า max-age (เริ่มด้วยค่าต่ำสำหรับทดสอบ เช่น 300 วินาที หรือ 3600 วินาที)
  6. เลือก includeSubDomains ถ้า Subdomain ทั้งหมดมี SSL ที่ถูกต้อง
  7. คลิก Save หรือ Enable

หมายเหตุ: ไม่ทุก Hosting Provider ที่มี cPanel จะมี GUI สำหรับ HSTS ถ้าไม่มี ให้ใช้วิธีที่ 2 (Manual ผ่าน .htaccess) แทน

วิธีที่ 2: ตั้งค่า HSTS ผ่าน .htaccess (ใช้ได้ทั่วไปที่สุด)

วิธีนี้ทำให้ได้สำหรับ Hosting ทุกแห่ง เพราะใช้ Apache Header Module ซึ่งเป็นมาตรฐาน ขั้นตอน:

  1. เชื่อมต่อกับ Hosting ของคุณผ่าน FTP หรือ File Manager ใน cPanel
  2. เลื่อนเข้าไปในโฟลเดอร์ Root ของเว็บไซต์ (public_html)
  3. ค้นหาไฟล์ชื่อ .htaccess ถ้ามีอยู่แล้ว ให้ Edit เพิ่มบรรทัด ถ้าไม่มี ให้สร้างไฟล์ใหม่ชื่อ .htaccess
  4. เพิ่มบรรทัดต่อไปนี้:
<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS
</IfModule>

อธิบายแต่ละส่วน:

5. บันทึกไฟล์ .htaccess ทับไฟล์เก่า

การตั้งค่า HSTS แบบค่อยเป็นค่อยไป (Staging)

ถ้าเป็นครั้งแรกที่เปิด HSTS บนเว็บไซต์ของคุณ ห้ามใส่ max-age เป็น 1 ปีเลย ให้ทำตามขั้นตอน Staging ต่อไปนี้ เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้น:

  1. สัปดาห์ที่ 1: ตั้ง max-age เป็น 300 วินาที (5 นาที) เพื่อทดสอบว่าการตั้งค่าใช้งานได้ปกติ
  2. สัปดาห์ที่ 2-3: เพิ่มเป็น 3600 วินาที (1 ชั่วโมง) และสังเกตการณ์ไม่มี Error ในบริการ
  3. สัปดาห์ที่ 4: เพิ่มเป็น 86400 วินาที (1 วัน)
  4. เดือนที่ 2: เพิ่มเป็น 604800 วินาที (1 สัปดาห์)
  5. เดือนที่ 3: เพิ่มเป็นค่าเต็มรูป 31536000 วินาที (1 ปี) ตามที่ต้องการเพื่อได้ความปลอดภัยสูงสุด

ดังนั้น ถ้าต้องการปล่อยเว็บไซต์ตั้งแต่วันนี้ สร้างไฟล์ .htaccess ดังนี้ก่อน:

<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=300; includeSubDomains" env=HTTPS
</IfModule>

ติดตามการทำงาน 5 นาที หากไม่มี Error ให้เปลี่ยนเป็น 3600 วินาที และทำตามขั้นตอนการเพิ่มค่าค่อยเป็นค่อยไปจนถึง 31536000 วินาที

HSTS Preload List คืออะไร?

นอกจาก HSTS Header ที่เซิร์ฟเวอร์ส่งมาแล้ว ยังมีการ Preload HSTS ในตัวเบราว์เซอร์ด้วย Google, Mozilla, Microsoft และเบราว์เซอร์อื่น ๆ ได้สร้าง Preload List ของเว็บไซต์ที่ต้อง HTTPS เสมอ รายการนี้ถูกฝังในรหัสเบราว์เซอร์ มีความหมายว่าแม้ว่าเป็นครั้งแรกที่ผู้ใช้เยี่ยมชมเว็บไซต์ของคุณ เบราว์เซอร์ก็จะเข้าถึง HTTPS โดยตรง

การเข้า Preload List เป็นการผูกมัดระยะยาวที่ย้อนกลับได้ยาก (ผ่านกระบวนการสมัครบนไซต์ https://hstspreload.org/) เพราะ:

สำหรับโครงการส่วนใหญ่ HSTS Header ที่เซิร์ฟเวอร์ส่งมาก็พอสำหรับการปกป้องความปลอดภัยแล้ว


ตรวจสอบว่า HSTS ทำงานถูกต้อง

หลังจากตั้งค่า HSTS ใน .htaccess หรือ cPanel แล้ว ให้ทดสอบด้วยคำสั่งต่อไปนี้:

# 1. ตรวจสอบ HSTS Header จาก HTTPS
curl -sI https://yourdomain.com | grep -i strict-transport-security

# 2. ดูรายละเอียด Response Header ทั้งหมด
curl -sI https://yourdomain.com

# 3. ทดสอบจาก HTTP (ควรเปลี่ยนเป็น HTTPS Redirect)
curl -sI http://yourdomain.com | head -1

# 4. ตรวจสอบ Redirect Location (ควรชี้ไปยัง HTTPS)
curl -sI -L http://yourdomain.com | grep -i location

# 5. ทดสอบจากเบราว์เซอร์ DevTools (F12) และดู Response Headers tab
Tip: ถ้าใช้ Mac หรือ Linux ลองคำสั่ง curl -sI https://yourdomain.com ถ้าใช้ Windows ให้ลองใช้ PowerShell คำสั่ง Invoke-WebRequest -Uri "https://yourdomain.com" -Method Head | Select-Object -ExpandProperty Headers หรือใช้เครื่องมือออนไลน์ https://securityheaders.com ได้เลย

แก้ปัญหาที่พบบ่อย

Error: "ERR_INVALID_HTTP_RESPONSE" เมื่อเข้าเว็บไซต์หลัง HSTS เปิด

เกิดเมื่อเบราว์เซอร์บังคับให้ใช้ HTTPS แต่เซิร์ฟเวอร์ของคุณทำให้เกิด Error หรือ Connection Refused ความเป็นไปได้:

วิธีแก้: หยุด HSTS ชั่วคราว (ลบบรรทัด HSTS ออกจาก .htaccess) แล้วแก้ปัญหา SSL ก่อน หากต้องการให้เบราว์เซอร์ลืม HSTS Max-age ที่เคยได้รับไป ให้รอจนกว่า max-age จะหมดอายุ (ตามที่ตั้งไว้เมื่อก่อน)

Error: "ไม่สามารถติดต่อเซิร์ฟเวอร์ได้" หลัง includeSubDomains เปิด

เกิดเมื่อใส่ includeSubDomains แต่ Subdomain บางตัวไม่มี SSL Certificate ที่ถูกต้อง เบราว์เซอร์จึงปฏิเสธที่จะเชื่อมต่อกับ Subdomain นั้น

วิธีแก้: ตรวจสอบให้แน่ใจว่า Subdomain ทั้งหมดที่คุณใช้งาน (www, api, blog, mail เป็นต้น) มี SSL Certificate ที่ถูกต้องแล้ว หรือควรลบ includeSubDomains ออกจากนั้นและเปิดเฉพาะ Domain หลักเท่านั้น

Error: "ไฟล์ .htaccess ไม่ได้รับการรับรู้" หรือไม่มี HSTS Header

อาจเกิดจาก:

วิธีแก้: ลองไฟล์ .htaccess ชั่วคราว (สำรองสำเนาไว้ก่อน) แล้วใส่บรรทัดง่าย ๆ เช่น Header set Test-Header "Hello" แล้วทดสอบด้วย curl ว่ามี Header Test-Header ออกมาหรือไม่ ถ้าไม่มี แสดงว่า mod_headers หรือ AllowOverride ไม่เปิด ให้ติดต่อ Hosting Provider

Error: "เบราว์เซอร์จำ HSTS เก่าไว้ ไม่อัพเดท"

เมื่อคุณลด max-age เนื่องจากต้องการแก้ปัญหา บางเบราว์เซอร์อาจจำค่า HSTS ที่เก่าไว้เสมอ ไม่ใช้ค่าใหม่ทันที

วิธีแก้:

Error: "ไม่สามารถรีเซ็ต HSTS Preload ได้" หรือ "เว็บไซต์ถูกล็อก"

ถ้าคุณเคยสมัคร Preload List และเพิ่ม preload ลงใน HSTS Header และตอนนี้ต้องการลบมัน อาจต้องใช้เวลา นานกว่า max-age หมดอายุ เนื่องจาก Preload List ถูกฝังในตัวเบราว์เซอร์

วิธีแก้: ไปที่ https://hstspreload.org แล้วค้นหาโดเมนของคุณ ถ้าอยู่ในรายการ ให้ Submit for Removal เพื่อขอให้ลบออกจากรายการ โดยปกติจะใช้เวลาไม่กี่สัปดาห์เมื่ออัพเดตเบราว์เซอร์เวอร์ชั่นใหม่


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

Q: HSTS และ Redirect HTTP to HTTPS มีความต่างกันอย่างไร?

A: Redirect HTTP to HTTPS คือการส่งข้อบอก (301 Redirect) ให้เบราว์เซอร์ไปเปลี่ยนจาก HTTP ไปเป็น HTTPS ซึ่งต้องส่งมาทุกครั้งที่ผู้ใช้เข้าผ่าน HTTP ในขณะที่ HSTS คือการบอกเบราว์เซอร์ให้จดจำและไม่ต้องบอกทุกครั้ง เบราว์เซอร์จะจำค่าไว้และใช้ HTTPS โดยตรงเอง ดังนั้น ควรมี Redirect HTTP to HTTPS ประกอบกับ HSTS เพื่อรักษาความปลอดภัยสูงสุด

Q: ควรตั้ง max-age เป็นเท่าไรดี?

A: ค่าที่นิยมคือ 31536000 วินาที (1 ปี) สำหรับเว็บไซต์ที่มั่นใจว่า SSL ได้รับการบำรุงรักษาอย่างดี สำหรับเว็บไซต์ใหม่หรือทดสอบ ให้ใช้ค่าต่ำก่อนเช่น 300, 3600 หรือ 86400 วินาที แล้วค่อยเพิ่มขึ้นทีละน้อย แล้วควรแน่ใจก่อนว่า SSL ไม่มีปัญหาแล้ว

Q: เว็บไซต์ของฉันยังใช้ HTTP อยู่และไม่มี SSL ต้องทำอะไรก่อน?

A: ต้องติดตั้ง SSL Certificate ก่อน ซึ่งสามารถใช้ AutoSSL ใน cPanel ได้ฟรีผ่านการใช้ Let's Encrypt แล้วรีไดเรกต์ HTTP ไปยัง HTTPS ก่อน จากนั้นค่อยเปิด HSTS เมื่อแน่ใจว่า SSL ทำงานถูกต้องแล้ว