المستوى: متوسط — تحتاج معرفة أساسية بـ Node.js والتعامل مع سطر الأوامر، ومفهوم HTTPS من بعيد.
اعمل أداة CLI لمراقبة انتهاء SSL Certificates قبل ما الموقع يقع
لو موقعك وقع نص ساعة الجمعة الصبح بسبب شهادة SSL منتهية، الخسارة مش بس في العملاء — الخسارة في الثقة. الأداة اللي هتبنيها هنا CLI بـ Node.js بتراقب أي عدد من الدومينات، وبتنبّهك على Slack قبل انتهاء الشهادة بـ 30 يوم. الكود كامل، شغّال، وممكن تربطه بـ cron في 5 دقائق.
المشكلة باختصار
أغلب المشاريع بتستخدم Let's Encrypt، اللي بيدّي شهادات صلاحيتها 90 يوم بس. لو الـ auto-renewal فشل لأي سبب — server reboot، nginx config اتغير، rate limit من Let's Encrypt، أو DNS challenge وقع — مش هتعرف غير لما المتصفح يقول للزائر "Your connection is not private". ساعتها بقيت بتلاحق المشكلة بدل ما تكون متجنبها.
طبقًا لتقرير Internet Society Pulse في 2024، حوالي 60% من حوادث انقطاع HTTPS كانت بسبب فشل في التجديد التلقائي، مش بسبب هجوم. يعني المشكلة الحقيقية مش "الأمان"، المشكلة "العملية".
إيه هي SSL Certificate أصلًا؟ (مثال للمبتدئ)
تخيّل إنك بتدخل مبنى حكومي، وعند الباب فيه حارس بيطلب منك بطاقة هوية. البطاقة فيها صورتك، اسمك، وتاريخ انتهاء. البطاقة دي اتختمت من جهة موثوقة (مصلحة الأحوال). لو حضرت بعد التاريخ، الحارس مش هيدخّلك حتى لو الصورة شبهك تمامًا. ليه؟ لأنه مش متأكد إن البيانات لسه دقيقة.
ده بالظبط اللي بيحصل في SSL: المتصفح هو الحارس، الموقع هو الزائر، والـ Certificate Authority (CA) هي مصلحة الأحوال. كل مرة بتفتح موقع HTTPS، المتصفح بيتحقق إن الشهادة لسه صالحة قبل ما يفتح أي اتصال.
التعريف العلمي الدقيق
SSL/TLS Certificate هو ملف بصيغة X.509 موقّع رقميًا من Certificate Authority، بيحتوي على:
- Subject: الدومين المالك للشهادة (مثلًا
example.com). - Issuer: الـ CA اللي أصدرها (Let's Encrypt، DigiCert...).
- Public Key: المفتاح العام المستخدم في الـ TLS handshake.
- Validity Period: تاريخ
notBeforeوnotAfter. - Signature: توقيع الـ CA على كل اللي فات.
الـ notAfter ده اللي إحنا مهتمين بيه. شهادات Let's Encrypt صلاحيتها 90 يوم، DigiCert ممكن تكون سنة، وApple بتجبر شهادات الـ public web تكون أقصاها 398 يوم منذ 2020.
الحل: TLS handshake خفيف بدون فتح اتصال HTTP كامل
الفكرة بسيطة. مش محتاج تعمل HTTP request للموقع. كل اللي محتاجه إنك تفتح TLS socket، تجيب الشهادة من الـ handshake، وتقفل. ده بياخد ميلي ثواني، وما بيستهلكش bandwidth من السيرفر اللي بتراقبه.
Node.js عنده موديول tls جوّاه بياخد دومين وبورت ويرجّع الشهادة جاهزة. مش محتاج مكتبات خارجية لـ core functionality.