เจอ SSL_PROTOCOL_ERROR เมื่อใช้ Nginx กับ Cloudflare เป็นปัญหาที่พบบ่อยและมักเกิดจากการตั้งค่า SSL Protocol ไม่ตรงกัน บทความนี้อธิบายสาเหตุ วิธีตั้งค่า SSL ที่ถูกต้องและปลอดภัย พร้อมขั้นตอนแก้ไขที่ทำตามได้ทันที
ทำไมถึงเจอ SSL_PROTOCOL_ERROR
SSL_PROTOCOL_ERROR เกิดขึ้นเมื่อเบราว์เซอร์และเซิร์ฟเวอร์ตกลงกันไม่ได้ว่าจะใช้ SSL/TLS Protocol เวอร์ชันไหนในการสื่อสาร สาเหตุหลักมีหลายประการ ทั้งการตั้งค่า SSL Protocol ใน Nginx ไม่ตรงกับที่ Cloudflare รองรับ ใบรับรอง SSL หมดอายุหรือไม่ถูกต้อง การเปิดใช้ Protocol เก่าที่ไม่ปลอดภัย หรือ SSL Mode ใน Cloudflare ตั้งไว้ไม่ตรงกับเซิร์ฟเวอร์
เมื่อใช้ Cloudflare เป็น CDN ข้อมูลจะถูกเข้ารหัส 2 ชั้น ชั้นแรกระหว่างเบราว์เซอร์กับ Cloudflare และชั้นที่สองระหว่าง Cloudflare กับเซิร์ฟเวอร์ Nginx ของคุณ ถ้าการตั้งค่าชั้นใดชั้นหนึ่งไม่ถูกต้อง Error จะเกิดขึ้นทันที
ตั้งค่า SSL Protocol ใน Nginx อย่างถูกต้อง
Protocol ที่ควรใช้และไม่ควรใช้
สิ่งสำคัญที่สุดคือใช้เฉพาะ TLS 1.2 และ TLS 1.3 เท่านั้น ห้ามเปิด SSLv3, TLS 1.0 หรือ TLS 1.1 เด็ดขาด เพราะมีช่องโหว่ความปลอดภัยร้ายแรง Cloudflare เองก็ไม่รองรับ Protocol เก่าเหล่านี้แล้ว
ขั้นตอนตั้งค่าใน nginx.conf
เปิดไฟล์ nginx.conf ที่อยู่ใน /etc/nginx/ แล้วตั้งค่า ssl_protocols ให้รองรับเฉพาะ TLS 1.2 และ TLS 1.3 ตั้ง ssl_ciphers ให้ใช้ Cipher Suite ที่แข็งแกร่ง ระบุ ssl_certificate และ ssl_certificate_key ให้ถูกต้อง และเปิด ssl_prefer_server_ciphers เพื่อให้เซิร์ฟเวอร์เลือก Cipher ที่ปลอดภัยที่สุด
สำรองข้อมูลก่อนแก้ไข
ก่อนแก้ไขไฟล์ nginx.conf ทุกครั้ง ต้องสำรองไฟล์เดิมไว้เสมอ เพื่อกรณีที่เกิดข้อผิดพลาดจะได้ย้อนกลับได้ทันที
ตั้งค่า SSL Mode ใน Cloudflare ให้ตรงกัน
Full (Strict) Mode
แนะนำให้ใช้ Full (Strict) Mode เสมอ โหมดนี้ Cloudflare จะตรวจสอบทั้งความถูกต้องของใบรับรอง SSL และ Protocol ที่ใช้ ให้ความปลอดภัยสูงสุด ต้องใช้ใบรับรอง SSL ที่ถูกต้องบนเซิร์ฟเวอร์ สามารถใช้ Origin Certificate จาก Cloudflare ได้
Full Mode
Cloudflare เข้ารหัสการสื่อสารกับเซิร์ฟเวอร์แต่ไม่ตรวจสอบความถูกต้องของใบรับรอง เหมาะสำหรับกรณีที่ใช้ Self-signed Certificate
Flexible Mode
ห้ามใช้ Flexible Mode สำหรับเว็บไซต์ที่มีข้อมูลสำคัญ เพราะการสื่อสารระหว่าง Cloudflare กับเซิร์ฟเวอร์จะไม่ถูกเข้ารหัส
ตรวจสอบและทดสอบหลังแก้ไข
หลังตั้งค่าเสร็จ ทดสอบ Configuration ด้วยคำสั่ง nginx -t ก่อนรีสตาร์ท ถ้าไม่มี Error ให้รีสตาร์ท Nginx ด้วย systemctl restart nginx จากนั้นใช้เครื่องมือทดสอบ SSL ออนไลน์เพื่อตรวจสอบว่า Protocol และ Cipher Suite ที่เปิดใช้ถูกต้องตามที่ตั้งค่าไว้
หากต้องการเซิร์ฟเวอร์ที่ตั้งค่า SSL มาให้พร้อมใช้งาน VPS พร้อม SSL Certificate ฟรีเป็นทางเลือกที่สะดวก สำหรับเว็บไซต์ที่ต้องการ Performance สูง Dedicated Server ให้ทรัพยากรเต็มที่สำหรับ SSL Termination
ปัญหาที่พบบ่อยและวิธีแก้
ใบรับรอง SSL หมดอายุ
ตั้ง Cron Job ให้ Renew ใบรับรองอัตโนมัติ ถ้าใช้ Let's Encrypt สามารถตั้ง certbot renew ให้รันอัตโนมัติได้
Mixed Content Warning
ตรวจสอบว่าทรัพยากรทั้งหมดบนเว็บไซต์ (รูปภาพ CSS JavaScript) ใช้ HTTPS ทั้งหมด ไม่มี HTTP ปนอยู่
Redirect Loop
เกิดจากการตั้งค่า Force HTTPS ทั้งใน Nginx และ Cloudflare พร้อมกัน ให้ตั้งค่า Redirect ที่จุดเดียวเท่านั้น
สำหรับองค์กรที่ต้องการความปลอดภัยสูง บริการ Security จะช่วยตรวจสอบและตั้งค่า SSL ให้ถูกต้องตาม Best Practice พร้อม Hosting ที่รองรับ SSL Certificate มาตรฐาน
คำถามที่พบบ่อย (FAQ)
ใช้ Cloudflare แล้วยังต้องติดตั้ง SSL บนเซิร์ฟเวอร์อีกหรือไม่
ต้อง ถ้าใช้ Full หรือ Full (Strict) Mode ซึ่งแนะนำอย่างยิ่ง การเข้ารหัสทั้งสองชั้นให้ความปลอดภัยสูงสุด สามารถใช้ Origin Certificate จาก Cloudflare ได้ฟรี
TLS 1.3 ดีกว่า TLS 1.2 อย่างไร
TLS 1.3 เร็วกว่าเพราะใช้ Handshake เพียง 1 รอบ (TLS 1.2 ใช้ 2 รอบ) ปลอดภัยกว่าเพราะตัด Cipher Suite ที่อ่อนแอออกทั้งหมด และรองรับ 0-RTT Resumption สำหรับ Connection ซ้ำ
แก้ไขแล้วแต่ยังเจอ Error อยู่ ทำอย่างไร
ลองล้าง Cache ของ Cloudflare รอ DNS Propagation ให้เสร็จ (อาจใช้เวลาถึง 24 ชั่วโมง) และตรวจสอบว่า Firewall ไม่ได้บล็อก Port 443
SSL_PROTOCOL_ERROR เป็นปัญหาที่แก้ไขได้ไม่ยากถ้าเข้าใจหลักการ ใช้เฉพาะ TLS 1.2 ขึ้นไป ตั้ง Cloudflare เป็น Full (Strict) Mode และตรวจสอบใบรับรอง SSL ให้ถูกต้อง หากต้องการความช่วยเหลือในการตั้งค่าเซิร์ฟเวอร์ DriteStudio พร้อมให้คำปรึกษาและดูแลระบบตลอด 24 ชั่วโมง