คำตอบสั้น ๆ: ตรวจวันหมดอายุและรายละเอียด SSL Certificate จากเบราว์เซอร์ OpenSSL Certbot และ PowerShell พร้อมสคริปต์แจ้งเตือนก่อนใบรับรองหมดอายุ
คู่มือนี้อธิบาย SSL Certificate ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
SSL Certificate (ชื่อที่ถูกต้องในปัจจุบันคือ TLS Certificate) ทุกใบมีวันหมดอายุ เมื่อหมดอายุแล้ว เบราว์เซอร์จะแสดงหน้าคำเตือนเต็มจอ ผู้เข้าชมส่วนใหญ่จะปิดหน้าเว็บทันที ร้านค้าออนไลน์รับชำระเงินไม่ได้ แอปมือถือที่เรียก API จะเชื่อมต่อไม่ได้ และโปรแกรมอีเมลจะแจ้งข้อผิดพลาดเรื่องใบรับรอง
ปัจจุบันอายุใบรับรองสั้นลงเรื่อยๆ Let's Encrypt ออกใบรับรองอายุ 90 วัน และตั้งแต่เดือนมีนาคม 2026 ใบรับรองสาธารณะแบบเสียเงินก็มีอายุได้ไม่เกิน 200 วันตามข้อกำหนดของ CA/Browser Forum ซึ่งจะลดลงอีกในปีต่อๆ ไป การต่ออายุอัตโนมัติจึงสำคัญ และการตรวจสอบว่าการต่ออายุทำงานจริงก็สำคัญไม่แพ้กัน บทความนี้แสดงวิธีตรวจใบรับรองจากเบราว์เซอร์ คำสั่ง OpenSSL บนเครื่องเซิร์ฟเวอร์ และบน Windows
สิ่งที่ต้องเตรียม (SSL Certificate)
- เครื่อง Linux หรือ macOS ที่มีคำสั่ง
openssl(มีมาให้ในระบบส่วนใหญ่) หรือ Windows ที่มี PowerShell - รายชื่อโดเมนและ Subdomain ทั้งหมดที่ใช้ HTTPS รวมถึงเซิร์ฟเวอร์อีเมล เช่น
mail.example.com - สิทธิ์
sudoบนเซิร์ฟเวอร์ ถ้าต้องการตรวจสถานะ Certbot
ขั้นตอนที่ 1: ตรวจจากเบราว์เซอร์ (SSL Certificate)
วิธีที่เร็วที่สุดสำหรับการตรวจครั้งเดียว ใน 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)