يبدو خطأ «لا شيفرة مشتركة» كأنه إعداد واحد يجب تغييره، والإعداد الذي يغيّره أكثر الناس هو الإعداد الخاطئ. OpenVPN يحتفظ بسياسات منفصلة لقناة التحكم التي تنفّذ مصافحة TLS ولقناة البيانات التي تحمل الحزم داخل النفق، والخطأ يذكر الأولى بينما يعدّل الناس الثانية. ومقارنة ما يسمح به كل طرف، بالترتيب الصحيح، تحوّل التخمين إلى قرارين أو ثلاثة: الإصدار، ثم قائمة الأجنحة، ثم بيانات الاعتماد.

أخطئ في هذا الترتيب وقد تضيّع ساعة في إضافة اسم AES إلى قائمة لم يُرجَع إليها قط.

قائمتا شيفرة، وواحدة فقط تُفسد المصافحة

تتفاوض قناة التحكم على جلسة TLS، وتُكتب سياستها بـ tls-cipher في TLS 1.2 ثم tls-ciphersuites في TLS 1.3. وتُضبط قناة البيانات على حدة بـ data-ciphers، حيث ينتج عن عدم التطابق اتصال يُنشأ ثم لا يستطيع تمرير حركة المرور. وكلتاهما تنتج أخطاء تذكر الشيفرات، ولهذا يختلط الأمر. فالمصافحة التي لا تكتمل أبداً تشير إلى قناة التحكم، بينما النفق القائم الذي يُسقط الحزم يشير إلى قناة البيانات.

اقرأ الرسالة كاملة بدل السطر الأول. إن عدم تطابق الإصدار، وجناحاً ناقصاً، وخوارزمية توقيع شهادة يرفضها الطرف الآخر، وفشل التحقق من اسم المضيف، كلها تنتهي بخطأ TLS، وواحد منها فقط يتعلق بقائمة الأجنحة لديك. والفصل بين هذه الفئات هو معظم التشخيص.

قارن الإصدارات قبل أن تقارن الأجنحة

الطرف المقيّد بـ TLS 1.2 والطرف الذي يشترط 1.3 لا يتشاركان أي إصدار، ولا سلسلة شيفرة تجسر ذلك. سجّل tls-version-min و tls-version-max على الجانبين، أو القيم الافتراضية للبنيات المستخدمة، لأن سياسة OpenSSL في توزيعة ما قد ترفع الحد الأدنى دون أن يقول أي خيار في OpenVPN ذلك. وإذا كان أحد الجانبين جهازاً أو عميلاً من طرف ثالث، فنافذته هي ما تسمح به برمجيته الثابتة. ولا تعني مقارنة الأجنحة شيئاً إلا بعد تداخل النافذتين.

وينبغي أن تذكر تلك السجلات الملفات التنفيذية الفعلية أيضاً. فـ openvpn على سطر الأوامر في حاسوبك المحمول ليس بالضرورة العميل الذي يتعامل مع ملف تعريف مستورد.

قوائم TLS 1.2 و TLS 1.3 لا تختلط

أسماء أجنحة TLS 1.2 تبدو مثل ECDHE-RSA-AES256-GCM-SHA384 وتنتمي إلى tls-cipher، الذي يقبل سلسلة شيفرة OpenSSL. وأجنحة TLS 1.3 تُسمّى مثل TLS_AES_256_GCM_SHA384 وتنتمي إلى tls-ciphersuites؛ وإضافة واحدة إلى سلسلة 1.2 لا تضبط قائمة 1.3، وقد يقبل المحلل النص دون أن يطابقه أبداً. والمرشح الصحيح لإصدار واحد لا يقول شيئاً عن الآخر. اكتب الإصدار الذي تُعدّ له كل قائمة.

openvpn --show-tls يطبع ما تدعمه البنية المحلية، وذلك جرد لا وعد: فقد لا يسمح الطرف البعيد بتلك الأجنحة، وقد لا يفعّلها ملف التعريف النشط. استخدمه لاستبعاد بنية لا تستطيع تقديم جناح ما أصلاً، ثم قارن القوائم المضبوطة.

أثبت التفاوض على اتصال جديد

المصافحة الناجحة هي الدليل الوحيد المعتد به، ويجب أن تأتي من العميل الحقيقي بملف التعريف الحقيقي. ارفع مستوى إسهاب الخادم، واتصل مرة واحدة، واقرأ إصدار البروتوكول والجناح المتفاوض عليهما من السجل بدل افتراض أن أول قيمة معروضة هي التي فازت. ثم أكّد قناة البيانات على حدة بحركة مرور عبر النفق، لأن المصافحة العاملة وقناة البيانات الفاشلة إصلاحان مختلفان. وكرّر ذلك بعد أي تغيير في الإعداد، لأن ملف تعريف عميل قديماً سبب شائع لنتيجة سلبية خاطئة.

إذا لم يوجد إعداد مشترك معتمد، فالجواب هو ترقية أو خطة هجرة، لا سياسة مُضعَّفة. فخفض tls-version-min، أو تعطيل التحقق، أو تمكين كل جناح قديم يزيل الرفض دون تلبية متطلب الأمان الذي أنتجه.

سجّل الإصدار المتفاوض عليه والجناح وشيفرة البيانات في تذكرة التغيير. فالشخص التالي الذي يواجه خطأ TLS سيبدأ من ذلك السجل بدل سلسلة شيفرة وُجدت في منشور بمنتدى.

مقالات ذات صلة