مشكلة التحقق من SSL في Excon لـ ONEBOX

مرحباً بالجميع،

لقد قمت للتو بإعداد خادم Discourse وبدأت اختباره، وهو حتى الآن رائع. لدي مشكلة حيث يفشل Onebox في العمل بسبب ما أعتقد أنه فلتر فحص SSL يفشل في التحقق باستخدام مكتبة excon. لقد قمت بتنزيل شهادة الجذر المخصصة وأضفتها إلى /etc/ssl/certs على المضيف، وحتى داخل الحاوية (للاختبار)، دون جدوى. لا يزال يظهر الخطأ التالي في /log/rails/production.log في كل مرة ألصق فيها رابطاً للتضمين.

فشل Onebox [رابط يوتيوب] SSL_connect returned=1 errno=0 state=error: فشل التحقق من الشهادة (تعذر الحصول على جهة إصدار محلية للشهادة) (OpenSSL::SSL::SSLError) تعذر التحقق من الشهادة.

يُشار إلى تغيير إعدادات excon الافتراضية لتوجيهها إلى مسار SSL مختلف، لكنني غير متأكد من كيفية القيام بذلك بأمان مع السماح لـ Discourse بالتحديث. هل يمكن لأي شخص تقديم نصيحة حول كيفية التأكد من أن شهادة الجذر المخصصة تُعتبر صالحة داخل excon؟ هل هناك أمر rails -r exec يمكنني إضافته إلى app.yml؟

شكراً جزيلاً،

غلين.

أي عنوان URL يظهر المشكلة؟ هل تستخدم التثبيت الرسمي المستند إلى Docker لمنصة Discourse؟

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

قد يحتاج إلى رابط التجزئة للعمل. هل يمكنك تجربة ما يلي ومعرفة ما إذا كان يحل المشكلة؟

  • قم بالخطوتين التاليتين:
    • أضف شهادتك المخصصة إلى /etc/ssl/certs داخل الحاوية

    • أضف رابط التجزئة: على سبيل المثال:

      ln -s my_custom_cert.pem /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/my_custom_cert.pem).0
      

شكرًا لك يا مايكل،

قمت بتعيين متغير البيئة وإنشاء الهاش، ولم أعد أرى خطأ SSL ظاهرًا الآن، لكن الـ onebox لا يزال لا يفعل أي شيء. لا أعرف ما إذا كان لدى جيف أي نصائح حول ما قد أكون أفعله بشكل خاطئ؟ @codinghorror.

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

غلين.

قد يكون ذاكرة التخزين المؤقت قد احتفظت بالفشل، لكن دعنا نختبر شيئًا واحدًا في كل مرة.

لا يجب أن تحتاج إلى إضافة متغير البيئة، لكن يمكنك التحقق مما إذا كان إضافة الشهادة قد نجح من خلال القيام، على سبيل المثال، بما يلي:

root:~# /var/discourse/launcher enter app
root@app:/var/www/discourse# rails console
[1] pry(main)> Net::HTTP.get URI 'https://meta.discourse.org/about.json'

إذا حصلت على نتيجة (ولم تكن قد حصلت عليها من قبل)، فهذا يعني أن الشهادة مُثبّتة بشكل صحيح. بعد ذلك، يمكنك إضافة أوامر إلى تعريف الحاوية لتثبيت هذه الشهادة في كل إعادة بناء لضمان استمراريتها.

شكرًا لك يا مايكل، لقد عمل أمر وحدة تحكم Rails بشكل جيد، وهو قادر على تنزيل ملف JSON الذي أشرت إليه.

لا أعرف ما إذا كان ذلك لن يعمل سابقًا، لكنني كنت قد قمت سابقًا بتثبيت شهادة الجذر في /etc/ssl/certs/ ومع ذلك لم يكن يعمل.

شغلت الأمر export SSL_CERT_DIR=“/etc/ssl/certs/” داخل الحاوية، ويبدو أن خطأ SSL قد اختفى بعد ذلك. على الأقل لم أعد أرى أي شيء في production.log.

شكرًا لك،

جلين.

في الواقع، أظن أنني عرفت المشكلة الآن. أعتقد أنها عبارة عن مطالبة مصادقة مرتبطة بفلتر الشركة. لقد قمت باستدعاء Net::HTTP.get في وحدة التحكم باستخدام رابط تضمين يوتيوب (YouTube oembed) لاسترجاع ملف JSON الخاص بالتضمين، لكنني حصلت بدلاً من ذلك على مستند HTML للمصادقة. لذا أعتقد أن هذا هو العائق الحالي. شكرًا جزيلًا لك يا مايكل.

هل قمت أيضًا بإنشاء الرابط الرمزي (symlink)؟ هذا جزء مهم جدًا.

لجعل الشهادة دائمة في مكانها، تريد تعديل ملف app.yml بإضافة أو تعديل قسم hooks ليصبح شيئًا مثل التالي:

hooks:
  before_code:
    - file:
        path: /etc/ssl/certs/custom-root.crt
        chmod: 644
        contents: |
          -----BEGIN CERTIFICATE-----
          …
          -----END CERTIFICATE-----
    - exec:
        cmd:
          - bash -c "ln -s custom-root.crt /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/custom-root.crt).0"

آه، على الأرجح لا يمكننا إضافة أي شيء في ملف app.yml لإصلاح ذلك.