ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ตรวจสอบ SSL Certificate และวันหมดอายุ

ตรวจสอบ SSL Certificate และวันหมดอายุ

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

ปัจจุบันอายุใบรับรองสั้นลงเรื่อยๆ Let's Encrypt ออกใบรับรองอายุ 90 วัน และตั้งแต่เดือนมีนาคม 2026 ใบรับรองสาธารณะแบบเสียเงินก็มีอายุได้ไม่เกิน 200 วันตามข้อกำหนดของ CA/Browser Forum ซึ่งจะลดลงอีกในปีต่อๆ ไป การต่ออายุอัตโนมัติจึงสำคัญ และการตรวจสอบว่าการต่ออายุทำงานจริงก็สำคัญไม่แพ้กัน บทความนี้แสดงวิธีตรวจใบรับรองจากเบราว์เซอร์ คำสั่ง OpenSSL บนเครื่องเซิร์ฟเวอร์ และบน Windows

สิ่งที่ต้องเตรียม

  • เครื่อง Linux หรือ macOS ที่มีคำสั่ง openssl (มีมาให้ในระบบส่วนใหญ่) หรือ Windows ที่มี PowerShell
  • รายชื่อโดเมนและ Subdomain ทั้งหมดที่ใช้ HTTPS รวมถึงเซิร์ฟเวอร์อีเมล เช่น mail.example.com
  • สิทธิ์ sudo บนเซิร์ฟเวอร์ ถ้าต้องการตรวจสถานะ Certbot

ขั้นตอนที่ 1: ตรวจจากเบราว์เซอร์

วิธีที่เร็วที่สุดสำหรับการตรวจครั้งเดียว ใน Chrome หรือ Edge คลิกไอคอนด้านซ้ายของช่อง URL เลือก Connection is secure แล้วเลือก Certificate is valid จะเห็นผู้ออกใบรับรอง (Issued By) และช่วงวันที่ใช้งานได้ (Validity Period) ใน Firefox คลิกไอคอนแม่กุญแจ เลือก Connection secure แล้ว More information และ View Certificate ชื่อเมนูอาจต่างกันเล็กน้อยตามเวอร์ชันเบราว์เซอร์

ข้อจำกัดคือเบราว์เซอร์อาจแสดงใบรับรองจาก CDN (เช่น Cloudflare) ไม่ใช่ใบบนเซิร์ฟเวอร์ต้นทาง และตรวจเซิร์ฟเวอร์อีเมลไม่ได้

ขั้นตอนที่ 2: ตรวจด้วย OpenSSL

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

ตัวอย่างผลลัพธ์

subject=CN = example.com
issuer=C = US, O = Let's Encrypt, CN = R12
notBefore=Aug 20 03:15:02 2026 GMT
notAfter=Nov 18 03:15:01 2026 GMT
X509v3 Subject Alternative Name:
    DNS:example.com, DNS:www.example.com
  • notAfter คือวันหมดอายุ (เวลา GMT ต้องบวก 7 ชั่วโมงเป็นเวลาไทย)
  • Subject Alternative Name คือรายชื่อโดเมนที่ใบนี้ครอบคลุม ถ้าเว็บเปิดด้วย www แต่ไม่มีชื่อนี้ในรายการ เบราว์เซอร์จะเตือนว่าชื่อไม่ตรง
  • -servername จำเป็นสำหรับเซิร์ฟเวอร์ที่มีหลายเว็บใน IP เดียว (SNI) ถ้าไม่ใส่อาจได้ใบรับรองของเว็บอื่นมาแทน
  • ตัวเลือก -ext ต้องใช้ OpenSSL 1.1.1 ขึ้นไป ซึ่งมีใน Ubuntu 22.04/24.04 และ AlmaLinux/Rocky 8-9

ถ้าต้องการตรวจเซิร์ฟเวอร์ต้นทางที่อยู่หลัง CDN ให้ต่อตรงไปที่ IP ของเซิร์ฟเวอร์ แต่ยังส่งชื่อโดเมนใน SNI

echo | openssl s_client -connect 203.0.113.10:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -dates

ตรวจเซิร์ฟเวอร์อีเมล

# SMTPS พอร์ต 465 และ IMAPS พอร์ต 993
echo | openssl s_client -connect mail.example.com:465 -servername mail.example.com 2>/dev/null | openssl x509 -noout -enddate
echo | openssl s_client -connect mail.example.com:993 -servername mail.example.com 2>/dev/null | openssl x509 -noout -enddate

# Submission พอร์ต 587 ที่ใช้ STARTTLS
echo | openssl s_client -starttls smtp -connect mail.example.com:587 -servername mail.example.com 2>/dev/null | openssl x509 -noout -enddate

ตรวจว่าจะหมดอายุภายในกี่วัน

ตัวเลือก -checkend รับค่าเป็นวินาที ตัวอย่างนี้ตรวจว่าจะหมดอายุภายใน 14 วันหรือไม่ (14 x 86400 = 1209600)

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -checkend 1209600

ถ้ายังเหลือมากกว่า 14 วันจะแสดง Certificate will not expire ถ้าน้อยกว่าจะแสดง Certificate will expire และคืนค่า Exit Code เป็น 1 ซึ่งนำไปใช้ในสคริปต์ได้

ขั้นตอนที่ 3: สคริปต์ตรวจหลายโดเมนและแจ้งเตือน

สร้างไฟล์ /usr/local/bin/check-ssl.sh

#!/bin/bash
# รายการ host:port ที่ต้องตรวจ
TARGETS="example.com:443 www.example.com:443 mail.example.com:993"
WARN_DAYS=21

for t in $TARGETS; do
  host=${t%%:*}
  end=$(echo | openssl s_client -connect "$t" -servername "$host" 2>/dev/null \
        | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
  if [ -z "$end" ]; then
    echo "ERROR: $t no certificate or connection failed"
    continue
  fi
  days=$(( ( $(date -d "$end" +%s) - $(date +%s) ) / 86400 ))
  if [ "$days" -lt "$WARN_DAYS" ]; then
    echo "WARNING: $t expires in $days days ($end)"
  fi
done
sudo chmod +x /usr/local/bin/check-ssl.sh
/usr/local/bin/check-ssl.sh

ถ้าทุกใบยังเหลือมากกว่า 21 วัน สคริปต์จะไม่แสดงอะไร ตั้งเป็น Cronjob ให้ทำงานทุกเช้า Cron จะส่งอีเมลผลลัพธ์ไปหา MAILTO เมื่อมีข้อความออกมาเท่านั้น (เครื่องต้องส่งอีเมลออกได้)

[email protected]
0 8 * * * /usr/local/bin/check-ssl.sh

คำสั่ง date -d เป็นของ GNU coreutils ใช้ได้บน Linux ถ้ารันบน macOS ต้องใช้รูปแบบ date -j -f แทน ดูวิธีตั้ง Cronjob ได้ที่ ตั้งค่า Cronjob บน DirectAdmin หรือ วิธีตั้ง Cronjob หรือ Crontab เพื่อให้ Script ทำงานอัตโนมัติบน Linux

ขั้นตอนที่ 4: ตรวจการต่ออายุอัตโนมัติของ Certbot

sudo certbot certificates

แสดงใบรับรองทุกใบที่ Certbot ดูแล พร้อม Expiry Date และจำนวนวันที่เหลือ (VALID: 62 days) จากนั้นทดสอบการต่ออายุโดยไม่ขอใบจริง

sudo certbot renew --dry-run

ต้องได้ข้อความ Congratulations, all simulated renewals succeeded ตรวจว่าตัวตั้งเวลาทำงานอยู่

systemctl list-timers | grep -i certbot

ถ้าติดตั้งผ่าน snap จะเห็น snap.certbot.renew.timer ถ้าติดตั้งจากแพ็กเกจของระบบจะเห็น certbot.timer หรือ certbot-renew.timer (AlmaLinux/Rocky ผ่าน EPEL ต้องสั่ง sudo systemctl enable --now certbot-renew.timer เอง) ดูการติดตั้งได้ที่ ติดตั้ง SSL ฟรีจาก Let's Encrypt ด้วย Certbot บน Nginx

บนแผงควบคุม ดูได้ที่ SSL/TLS Certificates ของโดเมนใน Plesk และ SSL Certificates ใน DirectAdmin (ดู ติดตั้ง SSL ฟรี Let's Encrypt บน DirectAdmin)

ขั้นตอนที่ 5: ตรวจบน Windows Server

ดูใบรับรองในเครื่องที่ IIS ใช้ด้วย PowerShell

Get-ChildItem Cert:\LocalMachine\My |
  Select-Object Subject, NotAfter, Thumbprint |
  Sort-Object NotAfter

ถ้าใช้ win-acme ดูรายการงานต่ออายุได้จากเมนูของโปรแกรม และตรวจงานใน Task Scheduler ดูที่ ขอ SSL ฟรีจาก Let's Encrypt บน IIS ด้วย win-acme และ ติดตั้ง SSL Certificate บน IIS

ตรวจสอบผลลัพธ์

  • วันหมดอายุจาก openssl ตรงกับที่ Certbot หรือแผงควบคุมแสดง ถ้าไม่ตรง แปลว่า Web Server ยังใช้ใบเก่าอยู่ ต้อง reload Web Server
  • ทุก Subdomain และทุกพอร์ตที่ให้บริการ (443, 465, 587, 993) ได้ใบรับรองที่ยังไม่หมดอายุ
  • สคริปต์หรือระบบแจ้งเตือนส่งข้อความได้จริง ลองตั้ง WARN_DAYS เป็น 365 ชั่วคราวเพื่อทดสอบ

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

ต่ออายุแล้วแต่เบราว์เซอร์ยังเห็นใบเก่า

Web Server ยังไม่ได้โหลดใบใหม่ ให้ sudo systemctl reload nginx หรือ apache2/httpd ถ้าใช้ Certbot ควรตั้ง Deploy Hook ให้ reload อัตโนมัติ บริการอีเมลอย่าง Postfix และ Dovecot ก็ต้อง reload ด้วย

การต่ออายุล้มเหลว

สาเหตุยอดนิยมคือ DNS ของโดเมนไม่ได้ชี้มาที่เซิร์ฟเวอร์นี้แล้ว พอร์ต 80 ถูกปิดทำให้ HTTP-01 Challenge ไม่ผ่าน หรือมี CAA Record ที่ไม่อนุญาต CA นี้ ตรวจ DNS ด้วย ตรวจสอบ DNS ด้วย nslookup และ dig และดู ตั้งค่า CAA Record เพื่อกำหนดผู้ออก SSL Certificate หากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ต 80 เพิ่มด้วย

บางอุปกรณ์แจ้งว่าใบรับรองไม่น่าเชื่อถือ แต่เบราว์เซอร์บนคอมพิวเตอร์ปกติ

มักเป็นเพราะเซิร์ฟเวอร์ไม่ได้ส่ง Intermediate Certificate มาด้วย ตรวจด้วย openssl s_client -connect example.com:443 -servername example.com -showcerts ควรเห็นใบรับรองอย่างน้อยสองใบ บน Nginx ต้องใช้ไฟล์ fullchain.pem ไม่ใช่ cert.pem

Let's Encrypt ไม่ส่งอีเมลเตือนแล้ว

Let's Encrypt หยุดส่งอีเมลเตือนวันหมดอายุตั้งแต่ปี 2025 จึงไม่ควรพึ่งอีเมลจาก CA อีกต่อไป ให้ใช้สคริปต์ในขั้นตอนที่ 3 หรือระบบเฝ้าระวังตาม ตั้งระบบแจ้งเตือนเมื่อเว็บไซต์ล่ม (Uptime Monitoring) ซึ่งส่วนใหญ่ตรวจวันหมดอายุ SSL ได้ด้วย

หากต้องการความช่วยเหลือเรื่องใบรับรอง ติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security