TLS والشهادات الرقمية
TLS والشهادات الرقمية
بروتوكول أمان طبقة النقل (TLS) هو البروتوكول الذي يضع قفل الأمان على كل عنوان URL يحمل بادئة HTTPS. يقع بين طبقة TCP (التي تعرفتَ عليها في الدرس الأول) وطبقة التطبيق، ويوفر ثلاثة ضمانات في آنٍ واحد: السرية (لا يستطيع أحد قراءة حركة المرور)، وسلامة البيانات (لا يمكن لأحد التلاعب بها دون اكتشاف ذلك)، والمصادقة (أنت تتحدث فعلاً مع الخادم الذي تظنه). إتقان TLS أمرٌ لا غنى عنه لأي مهندس DevOps — ستصطدم بأخطاء الشهادات، وستُجري تجديدها عند انتهاء صلاحيتها، وستضبط أداء المصافحة باستمرار.
مصافحة TLS خطوة بخطوة
المصافحة هي عملية التفاوض التي تجري قبل أن يتدفق أي بايت من بيانات التطبيق. تعتمد النشرات الحديثة تقريباً على TLS 1.3 حصراً، وهو أسرع وأكثر أماناً من الإصدارات السابقة. إليك بالضبط ما يحدث:
في TLS 1.3 يُرسل العميل حصته من المفتاح باستباق في الرسالة الأولى. يستطيع الخادم بذلك احتساب السر المشترك فوراً ويرسل شهادته ورسالة Finished في رحلة واحدة. يتحقق العميل من الشهادة ويرسل Finished الخاص به، ثم تتدفق البيانات المشفرة. هذا رحلة ذهاب وإياب واحدة — نصف كُمون TLS 1.2.
سلاسل الشهادات وسلسلة الثقة
الشهادة وحدها لا تثبت شيئاً ما لم يكن المتصفح أو نظام التشغيل يثق بالجهة التي وقّعتها. يعمل نموذج الثقة كسلسلة:
- CA الجذر — موقّع ذاتياً، مُضمَّن في أنظمة التشغيل والمتصفحات. أمثلة: ISRG Root X1 (جذر Let's Encrypt)، DigiCert Global Root CA.
- CA الوسيط — موقَّع من الجذر، يُستخدم للإصدار اليومي للشهادات. تُبقى الـ CA الجذرية دون اتصال؛ الوسطاء هم من يُجري التوقيع الفعلي.
- شهادة الكيان الطرفي (الورقة) — شهادة خادمك، موقَّعة من الوسيط.
عندما يُرسل خادمك شهادته، يجب أن يُرسل معها الوسيط/الوسطاء أيضاً. لا تقوم المتصفحات بجلب الوسطاء الناقصين — إنها تفشل فحسب. حادثة إنتاج كلاسيكية: نشر شهادة دون تضمين سلسلة الوسيط. تحقق من ذلك بـ:
شهادات SAN (أسماء بديلة للموضوع)
حقل CN (الاسم الشائع) في الشهادة هو حقل قديم ولا تعود المتصفحات تستخدمه للتحقق من اسم المضيف — إنها تتحقق فقط من امتداد اسم بديل للموضوع (SAN). يمكن لشهادة واحدة حماية أسماء مضيفين كثيرة عبر عدة SANs:
DNS:example.comDNS:www.example.comDNS:api.example.comDNS:*.staging.example.com(حرف بدل — مستوى واحد فقط)
تغطي SANs ذات حرف البدل (*.example.com) مستوى نطاق فرعي واحداً فقط ولا تشمل النطاق الجذر (example.com) أو النطاقات الفرعية الأعمق (a.b.example.com). بالنسبة للخدمات المصغرة ذات الأسماء الكثيرة، تكون شهادة واحدة متعددة SANs أبسط بكثير من إدارة عشرات الشهادات المنفردة.
Let's Encrypt وإدارة الشهادات التلقائية (ACME)
تُصدر Let's Encrypt شهادات DV (التحقق من النطاق) مجانية لمدة 90 يوماً عبر بروتوكول ACME. العمر القصير مقصود — يُجبر على الأتمتة ويحدّ من الضرر الناجم عن اختراق المفتاح. في الإنتاج، لا تقوم أبداً بتنزيل شهادة يدوياً؛ تُشغّل عميل ACME الذي يتولى الإصدار والتجديد تلقائياً.
أسلوبا التحقق الشائعان:
- HTTP-01 — يضع ACME رمزاً على المسار
http://yourdomain/.well-known/acme-challenge/<token>. يعمل مع أي مضيف يمكن الوصول إليه على المنفذ 80. لا يمكن استخدامه لأحرف البدل. - DNS-01 — ينشئ ACME سجل TXT باسم
_acme-challenge.yourdomain. يعمل مع أحرف البدل والمضيفين الداخليين والمضيفين غير المعرضين على المنفذ 80. يتطلب وصولاً إلى API الـ DNS.
إنهاء TLS في الإنتاج
يُنهى TLS عادةً عند الحافة — موازن تحميل، بوابة API، أو وكيل عكسي — بحيث تتواصل خدمات الخلفية عبر HTTP عادي على شبكة خاصة. يُسمى هذا تفريغ TLS. للخدمات التي تتطلب تشفيراً كاملاً من طرف لطرف (معالجات الدفع، الرعاية الصحية)، يُستخدم mTLS (TLS المتبادل): يُقدم كلٌّ من العميل والخادم شهادته، مما يمنح هوية قوية لكلا الطرفين. تُؤتمت شبكات الخدمات (Istio، Linkerd) mTLS بين كل Pod في المجموعة.
تشخيص أخطاء الشهادات
أكثر أخطاء الشهادات شيوعاً في الإنتاج وكيفية التحقيق فيها:
- CERTIFICATE_VERIFY_FAILED / ERR_CERT_AUTHORITY_INVALID — الخادم لم يرسل السلسلة الكاملة. تحقق بـ
openssl s_client -showcerts. - ERR_CERT_DATE_INVALID / certificate has expired — أتمتة التجديد توقفت. تحقق من
certbot certificatesوسجلات cron وما إذا كان hook إعادة التحميل قد نُفّذ. - ERR_CERT_COMMON_NAME_INVALID / hostname mismatch — اسم المضيف الذي تتصل به غير موجود في SANs الشهادة. افحص بـ
openssl x509 -noout -ext subjectAltName. - SSL_ERROR_RX_RECORD_TOO_LONG — الخادم يستجيب بـ HTTP عادي على منفذ توقع العميل منه TLS. خطأ إعداد كلاسيكي: حركة مرور تصل على المنفذ 80 بدلاً من 443.
curl -k أو verify=False في Python أو PYTHONHTTPSVERIFY=0 مقبولة فقط في تصحيح الأخطاء المحلي المعزول. في بيئات التجهيز أو أنابيب CI، إنها تُخفي مشكلات حقيقية في الشهادات ستظهر في الإنتاج. إذا لم تكن PKI الداخلية موثوقة، ثبّت شهادة CA في مخزن الثقة بالنظام — لا تعطّل التحقق.
TLS هو أساس كل خدمة آمنة ستُشغّلها. اعتد على استخدام openssl s_client كأداة استجابة أولى؛ فهي تخبرك بأكثر مما تحتاجه عن اتصال TLS في خمس ثوانٍ مقارنةً بما توفره معظم الأدوات الرسومية في خمس دقائق.