ما هي سلسلة شهادات SSL (Certificate Chain)؟
يقوم أمان SSL على سلسلة ثقة (chain of trust). فكل شهادة SSL تكتسب موثوقيتها بتوقيع الهيئة التي تعلوها:
شهادة Root CA ← الشهادة (الشهادات) الوسيطة (Intermediate) ← شهادة الموقع
لا تثق المتصفحات بصورة مضمّنة إلا بشهادات root CA. ويجب أن تكون كل حلقة في السلسلة من شهادة الموقع حتى الـ root قابلة للتحقق. فإذا كانت إحدى الحلقات مفقودة أو معطوبة ظهر خطأ سلسلة الشهادات.
أخطاء سلسلة الشهادات الشائعة
1. Incomplete Chain (سلسلة ناقصة)
هو أكثر أخطاء السلسلة شيوعًا. تكون شهادة الموقع وحدها مثبّتة على الخادم، والشهادة (الشهادات) الوسيطة مفقودة.
الأعراض
- يعمل الموقع في Chrome لكنه يعطي خطأ في Firefox (يستطيع Chrome تنزيل الشهادة المفقودة بفضل دعم AIA، أما Firefox فلا يستطيع)
- يعمل على سطح المكتب لكنه يعطي خطأ على الجوال
- يُظهر اختبار SSL Labs الرسالة "Chain issues: Incomplete"
الحل
# نزّل الشهادة الوسيطة وأنشئ fullchain
cat your_domain.crt intermediate.crt > fullchain.pem
# Nginx
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/private.key;
# Apache
SSLCertificateFile /etc/ssl/your_domain.crt
SSLCertificateChainFile /etc/ssl/intermediate.crt
2. Wrong Order (ترتيب خاطئ)
إذا كان ترتيب دمج ملفات الشهادات خاطئًا ظهرت مشكلات على بعض المنصات.
الترتيب الصحيح
- شهادة الموقع (leaf / end-entity)
- الشهادة الوسيطة 1 (التي وقّعت شهادة الموقع)
- الشهادة الوسيطة 2 (إن وُجدت، وهي التي وقّعت الشهادة الوسيطة 1)
- شهادة الـ root لا تُضاف (فهي مضمّنة في المتصفح)
# تحقق من الترتيب
openssl s_client -connect domain.com:443 -showcerts 2>/dev/null | grep "s:" | head -10
# الترتيب في المخرجات:
# s:CN = yourdomain.com (site cert)
# s:CN = Sectigo RSA Domain Validation Secure Server CA (intermediate)
# ...يجب أن تكون بالترتيب الصحيح
3. Expired Intermediate (شهادة وسيطة منتهية الصلاحية)
حتى لو كانت شهادة موقعك سارية، فقد تكون صلاحية الشهادة الوسيطة قد انتهت. وفي هذه الحالة يتعذّر التحقق من السلسلة.
الحل
# تحقق من تاريخ الشهادة الوسيطة
openssl x509 -in intermediate.crt -noout -dates
# إذا انتهت صلاحيتها، نزّل الشهادة الوسيطة المحدثة من الـ CA
# Sectigo: https://support.sectigo.com/articles/Knowledge/Sectigo-Intermediate-Certificates
# DigiCert: https://www.digicert.com/kb/digicert-root-certificates.htm
4. مشكلات سلسلة Cross-Signed
تستخدم بعض هيئات الشهادات (وخصوصًا Let's Encrypt) سلسلة cross-signed للتوافق مع الأجهزة القديمة. وقد تظهر حالات عدم توافق أثناء الانتقال إلى الـ root الجديد.
مثال Let's Encrypt
- السلسلة الطويلة: DST Root CA X3 → ISRG Root X1 → شهادة وسيطة → Site Cert (cross-sign لدعم أجهزة Android القديمة؛ انتهت صلاحية هذا التوقيع المتقاطع في 2024 ولم يعد مستخدمًا)
- السلسلة القصيرة: ISRG Root X1 → شهادة وسيطة → Site Cert (السلسلة المستخدمة اليوم)
- يختار Certbot السلسلة الصحيحة افتراضيًا؛ وإذا كانت هيئة الشهادات تقدّم أكثر من سلسلة يمكن تحديد المفضلة عبر
--preferred-chain
أدوات اختبار سلسلة الشهادات
| الأداة | الميزة | الوصول |
|---|---|---|
| SSL Labs | تحليل شامل للسلسلة وتقرير chain issues | ssllabs.com/ssltest |
| DATASSL SSL Checker | فحص سريع لسلسلة الشهادات | datassl.com/ssl-checker |
| whatsmychaincert.com | اكتشاف تلقائي للشهادات الوسيطة المفقودة وإنشاء bundle | whatsmychaincert.com |
| OpenSSL CLI | فحص تفصيلي لسلسلة الشهادات | سطر الأوامر |
أوامر التحقق من سلسلة الشهادات
# اعرض جميع الشهادات التي يعيدها الخادم
openssl s_client -connect domain.com:443 -showcerts
# معلومات كل شهادة في السلسلة
openssl s_client -connect domain.com:443 -showcerts 2>/dev/null | \
awk '/BEGIN/{cert=""} {cert=cert$0"\n"} /END/{print cert | "openssl x509 -noout -subject -issuer -dates"}'
# تحقق من السلسلة
openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt site.crt
الخلاصة
أخطاء سلسلة الشهادات من أكثر مصادر مشكلات SSL شيوعًا. وتثبيت الشهادات الوسيطة الصحيحة بالترتيب الصحيح، وهي خطوة بهذه البساطة، يحل الغالبية العظمى من المشكلات. يمكنك اكتشاف الشهادات المفقودة تلقائيًا عبر whatsmychaincert.com، والتحقق من إعداداتك عبر SSL Labs.