تضارب بين OAuth2 و Letsencrypt

لدي حاوية Docker خاصة بـ Discourse تعمل على Ubuntu (تم إنشاؤها من قالب DigitalOcean) مع تمكين “Custom OAuth2”. إنها تعمل بشكل جيد للغاية، باستثناء أنها تفشل في تحديث شهادة Letsencrypt الخاصة بها.

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

إليك السجل (المحذوف):
\[Wed Jan 28 12:40:32 PM UTC 2026\] Renewing: ‘community.site’
\[Wed Jan 28 12:40:32 PM UTC 2026\] Renewing using Le_API=https://acme-v02.api.letsencrypt.org/directory
\[Wed Jan 28 12:40:33 PM UTC 2026\] Using CA: https://acme-v02.api.letsencrypt.org/directory
\[Wed Jan 28 12:40:33 PM UTC 2026\] Single domain=‘community.site’
\[Wed Jan 28 12:40:35 PM UTC 2026\] Getting webroot for domain=‘community.site’
\[Wed Jan 28 12:40:35 PM UTC 2026\] Verifying: community.site
\[Wed Jan 28 12:40:36 PM UTC 2026\] Pending. The CA is processing your order, please wait. (1/30)
\[Wed Jan 28 12:40:40 PM UTC 2026\] community.site: Invalid status. Verification error details: 1.2.3.4: Invalid response from https://oauth.site/authorize?client_id=xxx
\[Wed Jan 28 12:40:40 PM UTC 2026\] Please check log file for more details: /shared/letsencrypt/acme.sh.log
\[Wed Jan 28 12:40:40 PM UTC 2026\] Error renewing community.site.

إعادة بناء التطبيق (Rebuild app) يحل المشكلة للأشهر الثلاثة القادمة، ولكني أرغب في إصلاحها بشكل صحيح. أي اقتراحات؟

شكراً مقدماً.

لست متأكدًا من أنني أرى شيئًا واضحًا هنا، ولكن بصراحة، سأضع الإعداد خلف وكيل عكسي (reverse proxy) وأنهي شهادة SSL هناك، ثم أستخدم التحقق عبر نظام أسماء النطاقات (DNS validation) بدلاً من ذلك. (هذا مجرد حل بديل، وليس حلاً لأن المشكلة غير معروفة)

مزيد من المعلومات حول المشكلة:
أرى طلب التحقق acme-challenge الوارد إلى http://community.site/.well-known/…
يتم إعادة توجيهه إلى https://community.site/ ثم تتم إعادة توجيهه إلى /oauth_basic. إعادة التوجيه الثانية متوقعة تمامًا، ولكن ليس الأولى.
يظهر طلب التحقق الوارد في access.log، ويكون access.letsencypt.log فارغًا.

لقد وجدت ملفًا /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf يبدو أنه يُرجع دائمًا 301 إلى https://community.site لأي طلب إلى المنفذ 80.

تم إصلاح هذه المشكلة في شهر أغسطس الماضي، letsencrypt updates: renew location for .well-known, add support for … · discourse/discourse_docker@ae4887a · GitHub

إعجابَين (2)

مثير للاهتمام، لقد أعدت بناء التطبيق في 26 نوفمبر، لذا أتوقع أن يكون الإصلاح قد تم تضمينه بحلول ذلك الوقت…

على أي حال، شكراً جزيلاً لكم جميعاً على المساعدة. لنغلق الموضوع ونأمل ألا تعود المشكلة بعد إعادة البناء التالية.

آه، أرى أن الأمر كان أعمق من ذلك، يمكنك قراءة المزيد حول ذلك هنا حتى نهاية ذلك الموضوع وستلاحظ بعد ذلك أنه كان هناك إصلاح آخر في 22 ديسمبر. وهذا يفسر سبب مواجهتك له.

إعجابَين (2)

لقد اطلعت على الالتزام (commit)، وأنا أمتلكه مثبتًا. ولكن أعتقد أن هناك خطأ هناك.

return 301 https://${DISCOURSE_HOSTNAME}$request_uri;

يجب أن تكون

return 301 https://${DISCOURSE_HOSTNAME}\\$request_uri;

الرجاء تصحيح معلوماتي إذا كنت مخطئًا.

هذا هو بالضبط ما أصلحه الإصلاح الآخر الذي ذكرته، ويصلح

إعجابَين (2)

شكراً لك مرة أخرى، مفيد جداً!

إعجاب واحد (1)