أساسيات البنية التحتية للمفاتيح العامة (PKI)
أساسيات البنية التحتية للمفاتيح العامة (PKI)
كل اتصال TLS أجريته على الإطلاق — سواء إلى GitHub أو إلى لوحة تحكم السحابة أو بين الخدمات المصغرة — يعتمد على بنية تحتية للثقة تُسمى البنية التحتية للمفاتيح العامة (PKI). لا تقتصر PKI على ملف شهادة يجلس على خادم؛ إنها سلسلة من الإثباتات التشفيرية تربط شهادتك وصولاً إلى جهة جذر موثوقة يثق بها العميل مسبقاً. يجب على مهندسي DevOps الكبار أن يفهموا هذه السلسلة بعمق، لأن الأخطاء في أي حلقة تُسبب إخفاقات إنتاجية متسلسلة: ترفض المتصفحات الاتصالات، وتنهار مصادقة mTLS المتبادلة، وتفشل الدورة التلقائية بصمت.
جهات إصدار الشهادات وسلسلة الثقة
جهة إصدار الشهادات (CA) هي كيان مهمته توقيع الشهادات — أي ربط المفتاح العام بهوية محددة بصورة تشفيرية. توجد ثلاثة مستويات في PKI الإنتاجية:
- CA الجذر (Root CA) — مرساة الثقة المطلقة. شهادتها موقّعة ذاتياً. يشحن مورّدو أنظمة التشغيل والمتصفحات قائمة منتقاة من شهادات CA الجذر الموثوقة (مخزن الثقة). يُحفظ المفتاح الخاص لـ CA الجذر في وضع غير متصل بالإنترنت تماماً (في HSM داخل منشأة مؤمنة ماديّاً). يوقّع فقط على شهادات CA الوسيطة، ولا شيء آخر.
- CA الوسيطة (Intermediate CA) — جهة CA متصلة بالإنترنت، شهادتها موقّعة من CA الجذر. كل عمليات إصدار الشهادات اليومية تجري هنا. إن اختُرقت الوسيطة، يمكن سحبها دون المساس بالجذر.
- شهادة الطرف النهائي (Leaf Certificate) — الشهادة المثبّتة على خادم أو جهاز أو مستخدم. موقّعة من الوسيطة. هذا ما يراه
openssl s_clientعند الاتصال بخدمتك.
عندما يتحقق عميل (متصفح، curl، عميل gRPC) من شهادة، يسير عبر هذه السلسلة: الطرف النهائي ← الوسيطة ← الجذر. إن استطاع بناء سلسلة غير منقطعة تصل إلى جذر يثق به، نجح مصافحة TLS. تُسمى هذه العملية بناء السلسلة أو التحقق من المسار. يتحقق العميل من ثلاثة أشياء في كل خطوة: صحة التوقيع، وعدم انتهاء صلاحية الشهادة، وعدم سحبها.
الأسماء البديلة للموضوع (SANs)
اعتُمد حقل Common Name (CN) القديم وحده للتحديد بما تغطيه الشهادة. أما المتصفحات الحديثة وRFC 6125 فتشترط استخدام الأسماء البديلة للموضوع (SANs) بدلاً عنه. يمكن أن يحتوي امتداد SAN على:
- إدخالات
DNS:— أسماء مضيفين محددة مثلapi.example.comأو حرف بدل مثل*.example.com - إدخالات
IP:— تُستخدم في mTLS بين الحاويات حيث تكون عناوين IP هي الهوية - إدخالات
URI:— تستخدمها SPIFFE، مثلspiffe://cluster.local/ns/default/sa/payment-svc - إدخالات
Email:— لشهادات عميل S/MIME
لفحص SANs على أي شهادة من سطر الأوامر:
دورة حياة الشهادة
لكل شهادة تاريخ انتهاء صلاحية صارم. مراحل دورة الحياة هي:
- الإنشاء — إنشاء مفتاح خاص وطلب توقيع الشهادة (CSR). يحتوي CSR على مفتاحك العام وادعاءات الهوية (CN، SANs). المفتاح الخاص لا يغادر نظامك أبداً.
- الإصدار — تتحقق CA من CSR (عبر تحدي DNS-01 أو HTTP-01 لـ CA العامة، أو السياسة الداخلية لـ CA الخاصة)، توقّعه، وتُعيد الشهادة. فترة الصلاحية تُحدَّد هنا.
- النشر — تُحمَّل الشهادة والمفتاح الخاص على الخادم (Nginx، Kubernetes Secret، محرك PKI في Vault). يجب تقديم ملف السلسلة (الوسيطة + الجذر) إلى جانب الشهادة النهائية.
- التجديد — ابدأ التجديد عند نحو ثلثَي فترة الصلاحية. لشهادات Let's Encrypt لمدة 90 يوماً، يعني ذلك اليوم 60. لشهادات mTLS التي يصدرها Vault خلال 24 ساعة، يجب أن يتولى أتمتتك التدوير كل ساعة.
- السحب — إن اختُرق مفتاح خاص، تُسحب الشهادة عبر CRL (قائمة سحب الشهادات) أو OCSP. السحب غير موثوق في المتصفحات؛ الشهادات قصيرة الأمد هي الإجابة الأفضل.
إنشاء CSR وشهادة موقّعة ذاتياً
للخدمات الداخلية أو الاختبار، غالباً ما تحتاج إلى إنشاء CA خاصة وإصدار شهادات منها. إليك سير العمل الكامل باستخدام openssl:
أنماط الإخفاق الإنتاجية الشائعة
فهم أنماط الإخفاق هو ما يميّز المهندس الكبير عن المبتدئ. هذه هي الحوادث الحقيقية التي ستواجهها:
- سلسلة ناقصة يقدّمها الخادم — يرسل الخادم الشهادة النهائية فقط دون الوسيطة. المتصفحات على سطح المكتب تخزّن الوسيطات مؤقتاً وتبدو بخير؛ لكن متصفحات الموبايل و
curlوالعملاء بين الخدمات يفشلون مع رسالة unable to get local issuer certificate. دائماً اجمع الشهادة النهائية مع الوسيطة في الحزمة التي تقدّمها. استخدمopenssl s_client -connect host:443 -showcertsللتحقق من إرسال السلسلة الكاملة. - عدم تطابق SAN — شهادة لـ
api.example.comنُشرت خلف وكيل عكسي يُعيد التوجيه بصفتهapi-internal.example.com. يفشل التحقق من TLS. دائماً أدرج جميع الأسماء — الأسماء المستعارة الداخلية، وأسماء موازن التحميل، وأسماء DNS للحاويات — في قائمة SAN وقت الإصدار. - انحراف الساعة — شهادة صُدرت في 14:00:00 UTC ونُشرت على خادم ساعته 13:59:50 UTC ستُرفض كـ "not yet valid". مزامنة NTP شرط أساسي لـ PKI.
- مفاجأة انتهاء الصلاحية — تنتهي صلاحية الشهادات في 03:00 صباحاً ولا أحد يلاحظ حتى ينخفض الحركة وتُطلق مكالمة الطوارئ في 03:05. الحل: مراقبة
ssl_certificate_expiry_seconds(Prometheusblackbox_exporter، تنبيه عند 30 يوماً وأخرى عند 7 أيام). - الجذر غير موجود في مخزن الثقة — لم يُوزَّع جذر CA الخاص الداخلي على جميع الخدمات وصور Docker الأساسية. تفشل الخدمات الجديدة في mTLS. أدر توزيع مخزن الثقة عبر إدارة التهيئة (Ansible، Chef) أو اجعله مدمجاً في صورة Docker الأساسية.
مراقبة انتهاء صلاحية الشهادات في الإنتاج
إتقان PKI يفتح كل شيء في الدروس القادمة: يمكن لمحرك PKI في Vault أن يستبدل سير عمل openssl الثابت بالكامل، ليُصدر الشهادات برمجياً بصلاحيات تصل إلى ساعة واحدة، ويسحبها تلقائياً عند إيقاف خدمة ما. المفاهيم الأساسية من هذا الدرس — التسلسل الهرمي الثلاثي، دلالات SAN، مراحل دورة الحياة، وبناء السلسلة — هي الأساس الذي تحتاجه لتهيئة ذلك النظام بصورة صحيحة.