ما هو SSL/TLS Handshake؟
SSL/TLS Handshake (المصافحة) سلسلة من الخطوات تجري بين المتصفح والخادم قبل إنشاء الاتصال الآمن. في هذه العملية تُحدَّد المصادقة والبروتوكول وطريقة التشفير. وإذا فشلت المصافحة تعذّر إنشاء الاتصال الآمن.
مراحل TLS Handshake (4 خطوات)
- Client Hello: يرسل المتصفح إصدارات TLS ومجموعات التشفير (cipher suites) التي يدعمها
- Server Hello: يختار الخادم إصدار TLS ومجموعة تشفير ويرسل شهادته
- التحقق: يتحقق المتصفح من الشهادة وينشئ pre-master secret
- الإتمام: ينشئ الطرفان مفتاح الجلسة (session key) ويبدأ الاتصال المشفّر
إذا حدثت مشكلة في أي خطوة ظهر خطأ "Handshake Failed".
السبب 1: عدم توافق البروتوكول
لا يتفق المتصفح والخادم على إصدار TLS مشترك. ويحدث ذلك غالبًا حين لا يدعم الخادم سوى TLS 1.0/1.1 بينما يرفضهما المتصفح الحديث.
الحل
# تحقق من البروتوكولات التي يدعمها الخادم
openssl s_client -connect domain.com:443 -tls1_2
openssl s_client -connect domain.com:443 -tls1_3
# Nginx: تفعيل TLS 1.2 و 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# Apache: تفعيل TLS 1.2 و 1.3
SSLProtocol -all +TLSv1.2 +TLSv1.3
السبب 2: سلسلة الشهادات معطوبة
إذا كانت الشهادة الوسيطة ناقصة أو كان الترتيب خاطئًا فشل التحقق أثناء المصافحة.
الحل
# تحقق من سلسلة الشهادات
openssl s_client -connect domain.com:443 -showcerts
# أنشئ ملف fullchain (بالترتيب الصحيح)
cat site.crt intermediate.crt > fullchain.pem
# Nginx
ssl_certificate /etc/ssl/fullchain.pem;
السبب 3: شهادة منتهية الصلاحية
إذا انتهت مدة صلاحية الشهادة فقد تفشل المصافحة.
# تحقق من تاريخ الانتهاء
openssl s_client -connect domain.com:443 | openssl x509 -noout -dates
# الناتج:
# notBefore=Jan 15 00:00:00 2026 GMT
# notAfter=Apr 15 23:59:59 2026 GMT
السبب 4: عدم تطابق الشهادة والمفتاح (Key)
إذا لم تتطابق شهادة SSL مع ملف private key فلن يتمكن الخادم من التحقق من التوقيع أثناء المصافحة.
# التحقق من التطابق
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in key.pem | openssl md5
# يجب أن تكون قيمتا MD5 متطابقتين
السبب 5: تدخّل جدار الحماية أو IDS/IPS
قد يحجب جدار الحماية أو نظام كشف التسلل حركة SSL أو يفسدها.
الحل
- تحقق من أن المنفذ 443 مفتوح:
telnet domain.com 443 - افحص سجلات جدار الحماية بحثًا عن حالات حجب متعلقة بـ SSL
- تحقق من إعدادات SSL inspection في قواعد IDS/IPS
السبب 6: الحمل الزائد على الخادم (Server Overload)
حين يكون الخادم تحت حمل زائد قد لا يستطيع تخصيص موارد كافية للمصافحة. وتبادل المفاتيح بـ RSA تحديدًا يستهلك المعالج (CPU) بكثافة.
الحل
- استخدم تبادل المفاتيح ECDHE (أسرع من RSA)
- فعِّل SSL session caching
- استخدم TLS 1.3 (مصافحة أسرع — 1-RTT)
# Nginx: Session caching
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets on;
أدوات تتبّع الأخطاء
| الأداة | الاستخدام |
|---|---|
openssl s_client | معلومات مفصّلة عن المصافحة ورسائل الخطأ |
| Wireshark | تحليل TLS handshake |
| SSL Labs | اختبار SSL شامل عبر الويب |
curl -vvv | معلومات اتصال مفصّلة في وضع verbose |
| DATASSL SSL Checker | فحص سريع لسلسلة الشهادات |
الخلاصة
قد ينشأ خطأ SSL/TLS Handshake Failed عن أكثر من سبب. وباتباع نهج منظّم — التحقق أولًا من صلاحية الشهادة، ثم من السلسلة، ثم من توافق البروتوكول و cipher — يمكنك تشخيص المشكلة بسرعة. واستخدام TLS 1.3 و ECDHE يرفع مستوى الأمان ويقصّر زمن المصافحة معًا.