المستوى المطلوب: متوسط — تحتاج معرفة أساسية بـ Python و GitHub Actions أو cron، ومفهوم عام عن TLS handshake. لو لسه ما تعاملتش مع socket programming قبل كده، فيه مثال للمبتدئ في أول قسم بيشرح الفكرة بدون كود.
سنة 2020 خرجت Microsoft Teams من الخدمة 3 ساعات بسبب شهادة TLS واحدة منسية. الموظفين حول العالم وقفوا، والسبب كان سطر بيانات في خانة "تاريخ الانتهاء" محدش راجعه. سكربت Python في 50 سطر مع GitHub Actions يومي بيمنعك تحصلك نفس القصة، بصفر تكلفة شهرية على الـ free tier.
الفكرة باختصار
كل شهادة TLS عندها تاريخ انتهاء. لو الشهادة انتهت، المتصفح بيرفض الاتصال ويظهر صفحة حمراء "Your connection is not private". المستخدم بيقفل في 4 ثواني ويروح. السكربت اللي هنبنيه:
- يقرأ قائمة دومينات من ملف YAML واحد.
- يفتح TLS handshake مع كل دومين بدون ما يحمّل الصفحة كاملة.
- يستخرج تاريخ انتهاء الشهادة من حقل
notAfter. - يبعت Slack alert لو فاضل أقل من 21 يوم على الانتهاء.
مثال للمبتدئ — ترخيص السيارة
تخيّل عندك شركة فيها أسطول 40 سيارة. كل سيارة عندها رخصة قيادة بتنتهي في تاريخ مختلف. لو ما عندكش جدول مركزي يفكّرك بالتجديد، يوم بيجي وتلات سيارات بيوقفهم المرور في نفس الأسبوع، وكل سيارة منهم بتعطّل العميل اللي عليها. السكربت ده هو الجدول المركزي بتاع شهادات SSL: بيقولك قبل 21 يوم "الرخصة دي قربت تنتهي، روح جدّدها".
التعريف العلمي للسلوك
شهادة X.509 فيها حقلين أساسيين للزمن: notBefore و notAfter. الأخير ده هو تاريخ الانتهاء. المتصفح بيتحقق من الحقل ده محلياً قبل ما حتى يبدأ TLS handshake. لو التاريخ عدّى، الـ handshake بيفشل بـ SSL_ERROR_EXPIRED_CERT_ALERT ومحدش بيقدر يدخل الموقع. التحقق ده موصوف رسمياً في RFC 5280 §6.1 الخاص بـ Internet X.509 PKI.
الافتراض اللي السكربت ده مبني عليه: الدومينات public ومتاحة على بورت 443 بـ TLS 1.2 أو أحدث. مش بيشتغل على mTLS داخلي محتاج certificate authentication من العميل.
الخطوات التنفيذية
- أنشئ ملف
domains.ymlفيه كل الدومينات اللي عايز تراقبها. - اكتب سكربت Python يفتح socket TLS لكل دومين ويستخرج
notAfter. - قارن التاريخ مع اليوم. لو الفرق ≤ 21 يوم، أضف الدومين لقائمة التنبيهات.
- ابعت Slack message عبر incoming webhook.
- شغّله يومياً عبر GitHub Actions cron على
ubuntu-latest.