한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

คู่มือเกมแลค › L13 สถาปัตยกรรมเซิร์ฟเวอร์และการดูแลระบบ

ใบรับรอง TLS หมดอายุ/ตั้งค่าผิด TLS certificate expiry / misconfiguration

ID สาเหตุ in-cert · ผู้รับผิดชอบหลัก อินฟราเครือข่าย (ทีมอินฟรา) · ร่วมกับ อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา), พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)

เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →

ถ้าใบรับรองของเซิร์ฟเวอร์ล็อกอิน, API หรือแพตช์หมดอายุ หรือขาดใบรับรองกลาง (intermediate certificate) ไคลเอนต์ที่เชื่อมต่อใหม่ตั้งแต่วินาทีนั้นจะเชื่อมต่อ TLS ไม่สำเร็จ

ทำไม ใบรับรองพ้นวันหมดอายุ, เซิร์ฟเวอร์ส่งใบรับรองมาโดยไม่มีใบรับรองกลาง หรือวันที่/เวลาในเครื่องผู้เล่นผิด → ผลคือ ไคลเอนต์ตรวจใบรับรองไม่ผ่านแล้วตัดการเชื่อมต่อ TLS → บนหน้าจอ เข้าเกมไม่ได้/โหลดไม่จบที่ขั้นตอนล็อกอินหรือแพตช์, ใช้ไม่ได้เฉพาะฟีเจอร์ HTTPS อย่างร้านค้า คนที่เชื่อมต่ออยู่แล้วส่วนใหญ่เล่นได้ปกติ

อาการ
เข้าเกมไม่ได้/โหลดไม่จบ, กดไม่ติด/โรลแบ็ค
ปัจจัย
การหยุดชะงัก
ใครเจอ
ทั้งเซิร์ฟเวอร์, เฉพาะบางฟีเจอร์, เราคนเดียว
เกิดเมื่อไร
หลังล็อกอิน/หลังปิดปรับปรุง, ตอนทำแอ็กชันบางอย่าง
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก อินฟราเครือข่าย (ทีมอินฟรา) · ร่วมกับ อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา), พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
บันทึกข้อผิดพลาดของใบรับรองด้วย error code ที่แยกจากการเชื่อมต่อล้มเหลวแบบอื่นแล้วแจ้งผู้เล่น, ถ้าวันที่ผิดให้แนะนำให้ตั้งวันที่/เวลาของเครื่องเป็นอัตโนมัติ, ถ้าใช้ certificate pinning ให้ใส่คีย์สำรองไว้ด้วยและนัดกำหนดการเปลี่ยนใบรับรองกับทีมอินฟรา
งานฝั่งทีมอินฟรา
เครือข่าย: ถ้า terminate TLS ที่โหลดบาลานเซอร์หรือ CDN ให้ตั้ง alert สถานะการต่ออายุอัตโนมัติของใบรับรองแบบ managed และจำนวนวันที่เหลือ (ACM คือ DaysToExpiry), คง DNS record สำหรับการยืนยันไว้ เครื่องเซิร์ฟเวอร์/OS: ถ้า terminate TLS ที่เซิร์ฟเวอร์ ให้ตั้งการต่ออายุอัตโนมัติและโหลดคอนฟิกใหม่หลังต่ออายุ, ตั้งค่าเป็น chain ที่รวมใบรับรองกลางด้วย, ตรวจอายุที่เหลือของทุกที่อยู่ล็อกอิน, API และแพตช์จากภายนอกเป็นระยะแล้วตั้ง alert
ตัวเลขที่ควรรู้
ใบรับรอง Let’s Encrypt มีอายุ 90 วัน จึงแนะนำให้ต่ออายุทุก 60 วัน ส่วน AWS Certificate Manager ตรวจใบรับรองที่ยืนยันด้วย DNS ตั้งแต่ 45 วันก่อนหมดอายุแล้วต่ออายุอัตโนมัติ ถ้าการต่ออายุอัตโนมัติล้มเหลวเงียบ ๆ การเชื่อมต่อใหม่จะถูกปิดกั้นพร้อมกันตรงเวลาหมดอายุพอดี
บนกราฟ
การเชื่อมต่อหลุดพร้อมกัน · จำนวนล็อกอินที่สำเร็จ, จำนวน error ของ TLS handshake
จุดที่ต้องดู
ใช้ openssl s_client -connect HOST:443 -showcerts ดูรายการใบรับรองที่เซิร์ฟเวอร์ส่งจริง แล้วตรวจวันหมดอายุ (notAfter) ของแต่ละใบด้วย openssl x509 -noout -enddate ถ้า terminate TLS ที่โหลดบาลานเซอร์ ให้ดูจำนวน error ในการเจรจา TLS (AWS ALB/NLB คือ ClientTLSNegotiationErrorCount) และจำนวนล็อกอินที่สำเร็จ
สัญญาณว่าใช่
เลยวันหมดอายุแล้ว หรือรายการที่เซิร์ฟเวอร์ส่งมาไม่มีใบรับรองกลาง และเวลาที่ error เริ่มเพิ่มตรงกับเวลาหมดอายุหรือเวลาที่เปลี่ยนใบรับรอง
สัญญาณว่าไม่ใช่
รายการใบรับรองและวันหมดอายุปกติ แต่ล้มเหลวเฉพาะผู้เล่นบางคน: ให้ดูวันที่/เวลาในเครื่องของผู้เล่นคนนั้น หรือรายการ root certificate ของ OS รุ่นเก่า
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
รายละเอียดเพิ่มเติม
คอนฟิกที่ขาดใบรับรองกลางอาจดูปกติเมื่อเปิดด้วยเบราว์เซอร์บน PC เพราะเบราว์เซอร์จำใบรับรองกลางที่เคยได้รับจากเว็บไซต์อื่นไว้แล้วเติมส่วนที่ขาดให้ แต่ไคลเอนต์ที่ไม่ได้จำไว้แบบนั้น เช่น แอป Android จะล้มเหลว อายุใบรับรองก็กำลังสั้นลง Let’s Encrypt มีแผนลดอายุเริ่มต้นเหลือ 64 วันในปี 2027 และ 45 วันในปี 2028 คอนฟิกที่ตั้งตายตัวให้ต่ออายุทุก 60 วัน จะเหลือเวลาเผื่อแค่สี่วันกับใบรับรอง 64 วัน และจะเลยวันหมดอายุไปกับใบรับรอง 45 วัน AWS Certificate Manager เองก็ไม่ต่ออายุอัตโนมัติให้ใบรับรองที่นำเข้า (import) และถ้าลบ DNS record สำหรับการยืนยัน การต่ออายุจะล้มเหลว ลักษณะที่ล็อกอินไม่ได้คล้ายกับ “DNS ขัดข้อง/ช้า” แต่ปัญหาใบรับรองจะล้มเหลวที่ TLS handshake หลังหาที่อยู่เซิร์ฟเวอร์เจอแล้ว และเวลาเริ่มเกิดตรงกับเวลาหมดอายุหรือเวลาที่เปลี่ยนใบรับรอง

แหล่งอ้างอิง

  1. RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile IETF
    อายุของใบรับรองคือตั้งแต่ notBefore ถึง notAfter, การตรวจ path จะตรวจว่าเวลาปัจจุบันอยู่ในช่วงอายุของใบรับรองทุกใบใน chain หรือไม่ (ถ้านาฬิกาฝั่งที่ตรวจผิดก็จะล้มเหลว)
  2. FAQ Let's Encrypt
    อายุใบรับรองเริ่มต้น 90 วัน, แนะนำให้ต่ออายุทุก 60 วัน
  3. Decreasing Certificate Lifetimes to 45 Days Let's Encrypt
    ลดอายุเริ่มต้นเหลือ 64 วันตั้งแต่เดือนกุมภาพันธ์ 2027 และ 45 วันตั้งแต่เดือนกุมภาพันธ์ 2028, การต่ออายุแบบช่วงห่างตายตัว 60 วันจะไม่พอ จึงแนะนำให้ต่ออายุเมื่อผ่านไปประมาณ 2 ใน 3 ของอายุใบรับรอง
  4. Renewal for domains validated by DNS AWS
    45 วันก่อนหมดอายุ จะตรวจว่าใบรับรองถูกใช้งานอยู่ในเซอร์วิสของ AWS และมี CNAME record สำหรับการยืนยันหรือไม่ แล้วต่ออายุอัตโนมัติ ถ้ายืนยันไม่ได้จะแจ้งเตือนเมื่อเหลือ 30, 15, 7, 3 และ 1 วันก่อนหมดอายุ
  5. Managed certificate renewal in AWS Certificate Manager AWS
    ใบรับรองที่นำเข้า (import) และใบรับรองที่หมดอายุไปแล้ว ไม่อยู่ในขอบเขตการต่ออายุอัตโนมัติ
  6. Supported CloudWatch metrics AWS
    DaysToExpiry: จำนวนวันที่เหลือก่อนใบรับรองหมดอายุ, เผยแพร่วันละสองครั้งจนกว่าจะหมดอายุ
  7. Security with network protocols Android (Google)
    ถ้าเซิร์ฟเวอร์ส่งมาโดยไม่มีใบรับรองกลาง แอป Android จะล้มเหลวด้วย SSLHandshakeException แต่เบราว์เซอร์บน PC อาจไม่ error เพราะเติมด้วยใบรับรองกลางที่เคยได้รับไว้, ตรวจ chain ที่เซิร์ฟเวอร์ส่งด้วย openssl s_client
  8. Network security configuration Android (Google)
    ถ้าใช้ certificate pinning ต้องใส่คีย์สำรองไว้ด้วยเผื่อการเปลี่ยนคีย์หรือเปลี่ยน CA ไม่อย่างนั้นการเชื่อมต่อจะถูกตัดจนกว่าจะอัปเดตแอป
  9. openssl-s_client OpenSSL
    -showcerts: แสดงรายการใบรับรองที่เซิร์ฟเวอร์ส่งมาตามลำดับที่ส่ง (ยังไม่ได้ตรวจ chain)
  10. openssl-x509 OpenSSL
    -enddate: แสดงวันหมดอายุของใบรับรอง (notAfter), -checkend: ตรวจว่าจะหมดอายุภายในจำนวนวินาทีที่กำหนดหรือไม่
  11. CloudWatch metrics for your Application Load Balancer AWS
    ClientTLSNegotiationErrorCount: จำนวนการเชื่อมต่อที่สร้าง TLS session ไม่สำเร็จ เช่น กรณีที่ไคลเอนต์ตรวจใบรับรองของเซิร์ฟเวอร์ไม่ผ่านแล้วตัดการเชื่อมต่อ
  12. CloudWatch metrics for your Network Load Balancer AWS
    ClientTLSNegotiationErrorCount: จำนวน TLS handshake ที่เจรจาระหว่างไคลเอนต์กับ TLS listener ไม่สำเร็จ

สาเหตุที่ควรดูประกอบ

ชั้นเดียวกัน: L13 สถาปัตยกรรมเซิร์ฟเวอร์และการดูแลระบบ

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (เข้าเกมไม่ได้/โหลดไม่จบ)

ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง