أخطاء SSL/TLS في المتصفحات القديمة جداً عند الاتصال بـ Discourse

بعد إعداد مثيل Discourse الخاص بي باستخدام دعم Let’s Encrypt الافتراضي، تلقيت تقارير من بعض المستخدمين مفادها أن متصفحاتهم لا تستطيع إنشاء اتصال آمن مع Discourse. لقد أظهرت لقطة شاشة واحدة حصلت عليها من مستخدم بوضوح وجود خطأ في SSL/TLS. هذا خطأ من جانب المتصفح، ولا يرى المستخدمون أي شيء من Discourse.

بناءً على السياق، يبدو أن هؤلاء المستخدمين يعملون بأنظمة تشغيل أو متصفحات أقدم نوعًا ما. اشتبهت في البداية في أن دعم TLS 1.2 هو المشكلة، لكن المستخدم الذي قمت بفحصه يعمل بنظام Safari 10.1.2 على macOS (إصدار غير معروف)، ووفقًا لـ Can I use... Support tables for HTML5, CSS3, etc يجب أن يدعم Safari TLS 1.2 منذ الإصدار 7.

هل هناك سبب آخر غير TLS 1.2 قد يتسبب في فشل متصفح أو نظام تشغيل في إنشاء اتصال آمن مع تثبيت افتراضي لـ Discourse يستخدم دعم TLS الافتراضي عبر Let’s Encrypt؟ أحاول معرفة الأسئلة التي يجب أن أطرحها على مستخدمِي لتحديد طبيعة مشكلتهم وما إذا كان الحل يجب أن يكون من جانبهم أم من جانبنا.

كحل بديل: حسب فهمي، الإعداد الافتراضي هو إعادة توجيه حركة المرور الموجهة إلى http إلى https. هل توجد طريقة لإجراء فحص مسبق، مثل “فقط إذا كان المتصفح يدعم TLS 1.2” أو “فقط إذا كان المتصفح/نظام التشغيل أحدث من إصدار معين”، وإلا البقاء على http؟

هذا هو الرابط، في حال كانت لديكم فكرة حول كيفية التحقق مما إذا كان هناك شيء غير مُعدّ بشكل صحيح: https://forum.stadtteilgenossenschaft-wik.de

يمكنك اختبار موقعك باستخدام اختبار خادم SSL. تحتوي نتائج الاختبار على قسم يُسمى “محاكاة المصافحة” والذي يجب أن يعرض لك مجموعات المتصفح/نظام التشغيل التي تعمل أو لا تعمل.

مع أحدث صورة Docker، أرى تكوين TLS التالي:

يمكنك إرسال مستخدميك إلى https://www.ssllabs.com/ssltest/viewMyClient.html للحصول على مزيد من المعلومات حول إصدارات المتصفح ونظام التشغيل لديهم، بالإضافة إلى إصدارات TLS المدعومة.

شكرًا لك على الرد المفصل!

لقد قمت بتشغيل اختبار خادم SSL ولم أستطع العثور على أي خطأ في النتيجة:

هي نفس النتائج المذكورة في منشورك، حسب ما أستطيع رؤيته.

كانت الإخفاقات الوحيدة تتعلق بأنظمة التشغيل القديمة مع إصدارات Safari (8 و9) وإصدارات Windows القديمة مع IE 11. هذا الأخير يقلقني بعض الشيء: ألا ينبغي أن يدعم Discourse IE 11، وأن يدعم TLS 1.2 افتراضيًا؟

كما أن الاختبار لا يتضمن اختبارًا لـ Safari 10 على أقدم نظام تشغيل لا يزال مدعومًا، لذا ربما يفشل هذا أيضًا…

بالنسبة للمستخدمين الذين يعملون على إصدارات قديمة من نظام ويندوز، قد تحتاج إلى تمكين تشفيرات CBC:

أول ما يجب عليك فعله بعد ذلك هو توجيه هؤلاء المستخدمين إلى

للحصول على معلومات حول ما يدعمه متصفحهم. أسهل طريقة لمشاركة نتائجهم هي ربما أن يطلب منهم طباعة النتيجة كملف PDF وإرساله إليك.

شكرًا لك، لقد تلقيت ردًا من المستخدم. إنه يستخدم جهاز iPod Touch قديم جدًا:

قدرات SSL/TLS لمتصفحك
وكيل المستخدم: Mozilla/5.0 (iPod; CPU iPhone OS 6_1_6 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B500 Safari/8536.25

دعم البروتوكول

وكيل المستخدم الخاص بك يتمتع بدعم جيد للبروتوكولات.

يدعم وكيل المستخدم الخاص بك TLS 1.2، وهو إصدار البروتوكول الموصى به حاليًا.

لذا، على الرغم من أنه قديم (وأنا أدرك أنه بعيد جدًا عن الحد الأدنى لنظام التشغيل والمتصفح المدعومين في Discourse)، إلا أنني أود تمكينه من الاتصال بالموقع على الأقل ورؤية كيفية تعامل متصفحه مع HTML وJavaScript الحديثين.

هذا هو تقرير دعم TLS المفصل:

ميزات البروتوكول

البروتوكولات

TLS 1.3 لا
TLS 1.2 نعم
TLS 1.1 نعم
TLS 1.0 نعم
SSL 3 نعم
SSL 2 لا

مجموعات التشفير (بالترتيب حسب الأفضلية)

TLS_EMPTY_RENEGOTIATION_INFO_SCSV ( 0xff ) -
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 ( 0xc024 ) ضعيفة 256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ( 0xc023 ) ضعيفة 128
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ( 0xc00a ) ضعيفة 256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ( 0xc009 ) ضعيفة 128
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA ( 0xc007 ) غير آمنة 128
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA ( 0xc008 ) ضعيفة 112
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 ( 0xc028 ) ضعيفة 256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ( 0xc027 ) ضعيفة 128
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ( 0xc014 ) ضعيفة 256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ( 0xc013 ) ضعيفة 128
TLS_ECDHE_RSA_WITH_RC4_128_SHA ( 0xc011 ) غير آمنة 128
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA ( 0xc012 ) ضعيفة 112
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 ( 0xc026 ) ضعيفة 256
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 ( 0xc025 ) ضعيفة 128
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 ( 0xc02a ) ضعيفة 256
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 ( 0xc029 ) ضعيفة 128
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA ( 0xc004 ) ضعيفة 128
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA ( 0xc005 ) ضعيفة 256
TLS_ECDH_ECDSA_WITH_RC4_128_SHA ( 0xc002 ) غير آمنة 128
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA ( 0xc003 ) ضعيفة 112
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA ( 0xc00e ) ضعيفة 128
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA ( 0xc00f ) ضعيفة 256
TLS_ECDH_RSA_WITH_RC4_128_SHA ( 0xc00c ) غير آمنة 128
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA ( 0xc00d ) ضعيفة 112
TLS_RSA_WITH_AES_256_CBC_SHA256 ( 0x3d ) ضعيفة 256
TLS_RSA_WITH_AES_128_CBC_SHA256 ( 0x3c ) ضعيفة 128
TLS_RSA_WITH_AES_128_CBC_SHA ( 0x2f ) ضعيفة 128
TLS_RSA_WITH_RC4_128_SHA ( 0x5 ) غير آمنة 128
TLS_RSA_WITH_RC4_128_MD5 ( 0x4 ) غير آمنة 128
TLS_RSA_WITH_AES_256_CBC_SHA ( 0x35 ) ضعيفة 256
TLS_RSA_WITH_3DES_EDE_CBC_SHA ( 0xa ) ضعيفة 112
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ( 0x67 ) ضعيفة 128
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 ( 0x6b ) ضعيفة 256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA ( 0x33 ) ضعيفة 128
TLS_DHE_RSA_WITH_AES_256_CBC_SHA ( 0x39 ) ضعيفة 256
TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA ( 0x16 ) ضعيفة 112
TLS_ECDHE_ECDSA_WITH_NULL_SHA ( 0xc006 ) غير آمنة 0
TLS_ECDHE_RSA_WITH_NULL_SHA ( 0xc010 ) غير آمنة 0
TLS_ECDH_ECDSA_WITH_NULL_SHA ( 0xc001 ) غير آمنة 0
TLS_ECDH_RSA_WITH_NULL_SHA ( 0xc00b ) غير آمنة 0
TLS_RSA_WITH_NULL_SHA256 ( 0x3b ) غير آمنة 0
TLS_RSA_WITH_NULL_SHA ( 0x2 ) غير آمنة 0
TLS_RSA_WITH_NULL_MD5 ( 0x1 ) غير آمنة 0
(1) عندما يدعم متصفح SSL 2، تُعرض مجموعات SSL 2 الخاصة به فقط في أول اتصال بهذا الموقع. لعرض المجموعات، أغلق جميع نوافذ المتصفح، ثم افتح هذه الصفحة بالضبط مباشرة. لا تقوم بتحديث الصفحة.

تفاصيل البروتوكول

تسمية اسم الخادم (SNI) نعم
إعادة التفاوض الآمنة نعم
ضغط TLS لا
تذاكر الجلسة لا
تثبيت OCSP لا
خوارزميات التوقيع SHA384/RSA، SHA256/RSA، SHA1/RSA، SHA256/ECDSA، SHA1/ECDSA
المجموعات المسماة secp256r1، secp384r1، secp521r1
مفاوضة البروتوكول التالي لا
مفاوضة بروتوكول طبقة التطبيق لا
توافق مصافحة SSL 2 لا

معالجة المحتوى المختلط

اختبارات المحتوى المختلط
الصور سلبية نعم
CSS نشط نعم
سكريبتات نشطة نعم
XMLHttpRequest نشط نعم
WebSockets نشط نعم
إطارات نشطة نعم
(1) قد تسبب هذه الاختبارات تحذير محتوى مختلط في متصفحك. وهذا متوقع.
(2) إذا رأيت اختبارًا فاشلًا، حاول إعادة تحميل الصفحة. إذا استمر الخطأ، يرجى التواصل معنا.

آسف على التنسيق، فقد قام المستخدم بنسخ ولصق HTML النص الغني بالنسبة لي، وبعضها يفقد عند لصقه في Discourse. سأحاول معرفة كيفية إصلاح التنسيق لاحقًا.

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

[اقتباس=“supermathie, post:4, topic:127474”]
ربما تحتاج إلى تمكين تشفير CBC:
[/اقتباس]

لدي فكرة تقريبية عما تعنيه، ولكن ليس لدي أي فكرة عن كيفية القيام بذلك. هل يمكنك توجيهي إلى بعض الوثائق التي تشرح كيفية تغيير تكوين TLS لحاوية Discourse Docker لتمكين هذه؟

لا أعتقد أن Safari 6 سيعمل حتى لو تم حل مشاكل TLS بإضافة مجموعات تشفير إضافية.

يمكنك إضافة مجموعات التشفير المفقودة عن طريق تجاوز ملف تكوين nginx. أضف المقطع التالي (غير مختبر، لكنه يجب أن يعمل) إلى قسم hooks في ملف app.yml وقم بتغيير قيمة ssl_ciphers حسب رغبتك.

  after_ssl:
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /ssl_ciphers .*/
        to: ssl_ciphers <your_complete_cipher_list>;

بالمناسبة: أحاول إضافة دعم لشهادات المنحنيات الإهليلجية في Discourse، مما سيجعلها تعمل مع IE11 مباشرةً دون إعدادات إضافية.

نظام iOS 6؟! آخر إصدار منه صدر في أوائل عام 2014! هذا كان منذ أكثر من 5 سنوات!

أعلم، لقد فوجئت مثلك تمامًا. لا أتوقع منك دعمه، لكنني أريد أن يحصل المستخدم على بعض HTML على الأقل ويرى ما الذي يعمل وما الذي لا يعمل.

شكرًا لك يا @gerhard، لقد قمت بالتغيير الذي وصفته في /var/discourse/containers/app.yml (آمل أن يكون ملف app.yml الصحيح)، ثم شغّلت الأمر /var/discourse/launcher rebuild app كما هو موضح في تعليقات app.yml.

بعد ذلك، أعدت تشغيل الاختبار على ssllabs.com، لكن يبدو أن النتيجة لم تتغير: https://www.ssllabs.com/ssltest/analyze.html?d=forum.stadtteilgenossenschaft-wik.de&s=68.183.214.228&hideResults=on

لست متأكدًا من كيفية التحقق مما إذا كان تغيير الإعدادات قد عمل بالفعل (لكنه لم يؤثر على نتيجة الاختبار) أو ما إذا كان تغيير الإعدادات لم ينجح.

أوه، لم أقرأ منشورك بشكل صحيح @gerhard. إذا فهمت الأمر بشكل صحيح، فإن التكوين الذي قدمته سيجعل الشفرات المستخدمة صريحة، لكن القيمة التي استخدمتها هي في الأساس نفس الافتراضية، أليس كذلك؟ إذن لا يزال عليّ توسيعها بشفرات أخرى قد تدعمها المتصفحات الأقدم.

نعم، تمامًا. لم أرغب في نشر حل لإضافة شفرات ضعيفة إلى الإعدادات. ستضطر إلى اكتشاف ذلك بنفسك. :wink:

ولكن إذا كنت تقوم بإجراء هذه التغييرات، فراقب طلب السحب الذي أشرت إليه سابقًا. إذا تم دمجه، فسيعمل Internet Explorer 11 دون الحاجة إلى أي إعدادات إضافية.

أفهم ذلك، لا تريد جعل الأمر سهلاً جداً لدرجة أن يصبح الإعداد غير آمن. أحترم ذلك ولن أنشر الكود الكامل أيضاً.

إليك ما توصلت إليه حتى الآن: حددت مجموعات التشفير المفقودة لدعم المتصفحات/أنظمة التشغيل الأقدم من خلال النظر في، على سبيل المثال، Qualys SSL Labs - Projects / User Agent Capabilities: Safari 6 / iOS 6.0.1 (وأيضاً للآخرين). وبما أن مجموعات تشفير العميل مدرجة حسب التفضيل، فقد اخترت دائماً العنصر العلوي وتأكدت من دعمه، مفترضاً أنه إذا كان الخادم يدعم واحداً من القائمة، فذلك يجب أن يكون كافياً. هذه هي مجموعات التشفير التي حددتها:

  • ECDHE-ECDSA-AES256-CBC-SHA384 لـ Safari 6-8
  • ECDHE-RSA-AES256-CBC-SHA384 لـ IE 11 على Win 7/8.1/Phone 8.1 Update (وفقاً لـ @supermathie)
  • ECDHE-RSA-AES128-CBC-SHA256 لـ IE 11 على Win Phone 8.1

أخذت هذه القيم وأضفتها إلى نهاية قائمة ssl_ciphers، مفصولة بعلامات النقطتين، مفترضاً أن “نهاية القائمة” تعني “الأقل تفضيلاً، وسيتم استخدامها فقط إذا لم يدعم العميل أي شيء آخر”. ثم شغّلت /var/discourse/launcher rebuild app لتطبيق الإعداد الجديد وأعدت تشغيل الاختبار على SSL Server Test (Powered by Qualys SSL Labs) بعد مسح ذاكرة التخزين المؤقت. لكن النتائج لم تتغير.

توقعت أن تنجح الآن كل من اختبارات IE 11 الفاشلة وSafari 6-8، لكن المصافحة لا تزال تفشل. إذن يجب أن يكون هناك شيء ما أفتقده.

أيضاً، أحد مستخدمين يستخدم آيفون مع iOS 9/Safari 9، وبالنسبة لهم أيضاً تفشل الاتصال. ولكن وفقاً لنتائج اختبار SSL Labs، يجب أن يعمل هذا الاتصال بالفعل بشكل افتراضي (كما هو ظاهر أيضاً في نتيجة @gerhard أعلاه).

إذن يجب أن أفتقد شيئين:

  1. لماذا لا يزال الاتصال لا يعمل بعد إضافة دعم مجموعات التشفير؟
  2. لماذا يقول SSLLabs إنه يعمل لـ iOS 9 + Safari 9 لكنه لا يعمل فعلياً لمستخدمي؟

بخصوص النقطة 1: ما زلت غير متأكد من أنني طبقت الإعداد بشكل صحيح. بالإضافة إلى اختبار SSL Labs، هل توجد طريقة أخرى للتحقق من مجموعات التشفير التي يدعمها الخادم لمعرفة ما إذا كان تغيير الإعداد قد طُبق بشكل صحيح؟

بعد النظر في نتيجة SSLLab عن كثب، أعتقد أن هذا لا يعمل.

هذه هي النتيجة التي أراها على SSLLabs لخادومي بعد تطبيق الإعداد وإعادة البناء:

بحسب فهمي، كان يجب أن تُدرج العديد من الخيارات الإضافية، لأن الإعداد يحتوي على خيارات أكثر. هل يعني هذا أن تغيير الإعداد لم ينجح؟

أعتقد أن أسماء الشفرات التي اخترتها غير صحيحة. يُعد موقع Mapping OpenSSL cipher suite names to IANA names مصدرًا جيدًا لربط الشفرات التي يعرضها اختبار خادم SSL بالأسماء المستخدمة في OpenSSL (nginx).

في اختباراتي، أضفت :ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA، وبعد إعادة البناء، يبدو الاختبار كالتالي:

ربما توجد خلل في الاختبار؟ :person_shrugging: لا أملك إصدار Safari قديمًا لإجراء الاختبار. نحن ندعم فقط Safari 10 وما بعده. هل أنت متأكد من أن الفشل لا يزال بسبب خطأ في TLS؟

شكرًا لك، سأجرب ذلك!

تفحصت ملفات تكوين Discourse قليلًا ووجدت templates/web.ssl.template.yml. ما الفرق بين إجراء هذا التغيير على الشفرات عبر ملف app.yml وبين مجرد تغيير قائمة ssl_ciphers مباشرة في templates/web.ssl.template.yml؟

الملف النموذجي مُتحكَّم في إصداراته، بينما ملف app.yml ليس كذلك. ستواجه مشاكل عند تحديث المستودع إذا قمت بتحرير الملف النموذجي.

شكرًا لك، هذه كانت المشكلة، وإصلاح الأسماء جعل عملية المصافحة تعمل لجميع المتصفحات المختبرة المدرجة في قائمة SSLLabs. شكرًا جزيلاً على صبرك!

الآن، أنا مهتم بمعرفة ما يراه مستخدموهم بمجرد تجاوزهم خطأ HTTPS في متصفحاتهم القديمة. :smiley: