أتمتة مراقبة شهادات SSL قبل ما توقف موقعك
المستوى: متوسط
لو موقعك وقع مرة واحدة بسبب شهادة SSL منتهية، فانت عارف إن الدقيقة الواحدة من الخطأ ده بتاكل من ثقة العملاء. هنا سكربت واحد يفحص كل شهاداتك يوميًا وينبّهك قبل انتهائها بـ 14 يومًا، فمتوصلش للحظة التوقف أصلًا.
المشكلة باختصار
شهادات Let's Encrypt صالحة 90 يومًا فقط. التجديد المفروض يبقى آلي عبر certbot، لكن اللي بيحصل فعلاً إنه بيفشل في صمت: مهمة cron اتشالت، أو صلاحيات ملف اتغيّرت، أو منفذ التحقق كان مقفول لحظة التجديد. النتيجة إنك مبتعرفش بالمشكلة غير لما الموقع نفسه يقع.
الافتراض هنا إنك بتستخدم Let's Encrypt أو أي CA بتجديد آلي، وسيرفرك Linux فيه openssl وcurl.
ليه الموقع بيقف بمجرد انتهاء الشهادة
فكّر في شهادة SSL زي جواز سفرك. طالما ساري، بتعدّي من أي بوابة بسهولة. أول ما ينتهي، بيوقفوك عند البوابة حتى لو انت نفس الشخص بالظبط. الموقع كده بالظبط: أول ما الشهادة تنتهي، المتصفح بيوقف الزائر عند الباب برسالة حمراء.
علميًا، شهادة TLS بتحمل حقلين مهمين: notBefore وnotAfter. وقت الـ handshake، المتصفح بيقارن التاريخ الحالي بحقل notAfter. لو التاريخ عدّاه، بيرفض الاتصال ويطلع الخطأ NET::ERR_CERT_DATE_INVALID. مفيش صفحة تظهر، ومفيش تجاوز سهل للزائر العادي.
الحل: سكربت يقرأ تاريخ الانتهاء وينبّهك
الفكرة بسيطة: اتصل بالدومين، اقرأ حقل notAfter، احسب الأيام المتبقية، ولو أقل من 14 ابعت تنبيه. الرسم ده بيلخّص التدفق بالتفاصيل:
ودي الخطوات المرتّبة:
- حدد دوميناتك وحد التنبيه (14 يوم).
- اقرأ تاريخ الانتهاء من الاتصال المباشر بـ
openssl. - احسب الفرق بالأيام، وابعت على Slack لو قلّ عن الحد.
#!/usr/bin/env bash
set -euo pipefail
DOMAINS=("ahmedhaies.com" "lms.ahmedhaies.com")
THRESHOLD_DAYS=14
SLACK_WEBHOOK="https://hooks.slack.com/services/XXX/YYY/ZZZ"
now_epoch=$(date +%s)
for domain in "${DOMAINS[@]}"; do
# اقرأ تاريخ انتهاء الشهادة من الاتصال المباشر
end_date=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
end_epoch=$(date -d "$end_date" +%s)
days_left=$(( (end_epoch - now_epoch) / 86400 ))
echo "$domain: باقي $days_left يوم"
if (( days_left < THRESHOLD_DAYS )); then
curl -sS -X POST "$SLACK_WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{\"text\":\"تنبيه: شهادة $domain تنتهي خلال $days_left يوم\"}"
fi
done