Gunicorn: أضف دعمًا للثوابت المسماة في علامة --ssl-version

تم إنشاؤها على ١٥ سبتمبر ٢٠١٥  ·  37تعليقات  ·  مصدر: benoitc/gunicorn

أنا أستخدم gunicorn مع ssl cert and key. يوفر اتصال TLS 1.0. هل من الممكن تكوين gunicorn لاستخدام TLS 1.2؟

Improvement Documentation help wanted FeaturSSL - Mailing List -

ال 37 كومينتر

مرحبًا rrajaravi ، هل حاولت تعيين http://docs.gunicorn.org/en/latest/settings.html#ciphers ؟

صدم

كيف تحدد العمل أم لا؟

هل يمكننا إغلاق هذه القضية؟

TL ؛ DR
يبدو أن Gunicorn يدعم فقط:
TLSv1
SSLv2

ولا يدعم:
SSLv3
SSLv23
TLSv1_1
TLSv1_2

berkerpeksag @ يبدو أن المستندات الموجودة على http://docs.gunicorn.org/en/latest/settings.html#ciphers غير صحيحة.
لقد وجدت البروتوكولات في ssl.py. لا يعمل أي منها باستثناء TLSv1 و SSLv2 عند توفيره في خيار سطر الأوامر على Ubuntu 14.04 LTS و Python 3.5.1 و OpenSSL 1.0.1f 6 يناير 2014

الباقي يفشل مع الخطأ:
[2016-03-22 08:51:49 +0000] [2924] [خطأ] استثناء في العملية العاملة:
Traceback (آخر مكالمة أخيرة):
ملف "/home/me/Envs/myproject/lib/python3.5/site-packages/gunicorn/workers/sync.py" ، السطر 126 ، في المقبض
self.cfg.ssl_options)ملف "/usr/local/lib/python3.5/ssl.py" ، السطر 1064 ، في wrap_socketالأصفار = الأصفار)ملف "/usr/local/lib/python3.5/ssl.py" ، السطر 690 ، في ** init
self._context.set_ciphers (الأصفار)
ssl.SSLE خطأ: ('لا يمكن تحديد تشفير.'،)


/usr/local/lib/python3.5/ssl.py
تحدد الثوابت التالية متغيرات بروتوكول SSL المختلفة:

PROTOCOL_SSLv2
PROTOCOL_SSLv3
PROTOCOL_SSLv23
PROTOCOL_TLSv1
PROTOCOL_TLSv1_1
PROTOCOL_TLSv1_2

شكرًا لفرز هذا ،edwardotis. أنا أعيد فتح هذا لتوضيح الوثائق.

berkerpeksag أيضًا هل نستخدم التقصير الجيد؟

TLSv1 جيدًا بالنسبة لإصدارات Python الأقدم ، ولكن ربما يمكننا تغيير القيمة الافتراضية إلى SSLv23 لاستخدام أفضل بروتوكول متاح (لكل من العملاء والخوادم).

أيضًا ، أعتقد أنه يجب علينا رفع استثناء إذا تم استخدام SSLv2 أو SSLv3 في Gunicorn 20 (سيكون من الرائع إهمالهم في الإصدار 19.x التالي).

berkerpeksag : +1:

هل قام أحد بتنفيذ هذه التغييرات؟ إذا لم يكن الأمر كذلك ، فسأكون سعيدًا لمنحه فرصة وفتح العلاقات العامة .. أن تكون قادرًا على ضبط التشفير على شيء ما> TLSv1.0 أمر مهم بالنسبة لنا ومن ما يمكننا أن نرى أي إصدار من TLS أكبر من 1 علبة ' t be set .. يتم تعيينها بشكل افتراضي مرة أخرى إلى 1.0 (جربنا تلك المدرجة في المستندات والثوابت المدرجة هنا ولكن دون جدوى) - فقط المخرجات No cipher can be selected

تضمين التغريدة :) شكرا!

من الممكن استخدام إصدارات أخرى. تحتاج فقط إلى تحديد ثابت لـ --ssl-version في سطر الأوامر. تأتي هذه الثوابت من الوحدة النمطية ssl stdlib.

$ python -c "import ssl; print(ssl.PROTOCOL_SSLv23)"     
  2
$ python -c "import ssl; print(ssl.PROTOCOL_TLSv1_2)"
  5

ما عليك سوى تحديد --ssl-version 2 أو --ssl-version 5 ويجب أن يكون لديك دعم تشفير TLS 1.2.

AndrewJHart ألق نظرة على # 1440 إذا كنت ترغب في المساهمة ببعض التحسينات على SSL. يجب أن ننتقل إلى استخدام SSLContext للتحكم بشكل أفضل في السياق ، مثل إعداد تفضيل ترتيب تشفير الخادم. سوف أنشر فرقًا حول هذه المشكلة للحظات مع مثال على البدء في تنفيذ هذا لعامل المزامنة. أي مساعدة في تحسين دعم SSL سيكون موضع تقدير كبير.

أيضًا ، سيكون طلب السحب البسيط لتغيير القيمة الافتراضية في gunicorn / config.py لاستخدام ثابت SSLv23 بدلاً من TLSv1 أمرًا رائعًا.

آسف ، قصدت أن أقول # 1140

لا أفهم سبب إعادة فتح هذه المشكلة. لقد اختبرت Gunicorn باستخدام --ssl-version 2 ووجدت أن شفرات TLS 1.2 تعمل بشكل جيد.

سأغلق ، ولكن يرجى إعادة الفتح وشرح ما إذا كنت تعتقد أنني فعلت ذلك عن طريق الخطأ.

فتحت # 1249 لتتبع تغيير الافتراضي.

أعدت فتحه للأسباب التالية:

أ) يجب أن يكون المستخدمون قادرين على تمرير 'SSLv23' أو 'TLSv1_2' بدلاً من 2 ، أو 5 .
ب) يجب أن نوثق الخيارات المتاحة بدلاً من إعادة توجيهها إلى مستندات Python. https://docs.python.org/3.5/library/ssl.html هي واحدة من أطول المستندات في stdlib ولا ينبغي للمستخدمين قضاء الكثير من الوقت لمجرد معرفة الخيارات المتاحة.

أعيد فتحه ، مضيفا تسميات الوثائق.

اسمحوا لي أن أعرف ما هو مطلوب هنا ، إذا تمكنا من إغلاقه قبل إصدار 19.5 (أي قبل الأربعاء) سيكون رائعًا :)

هذا مفتوح لتقديم الدعم فقط للثوابت المسماة في
- علم إصدار SSL.

في يوم الاثنين ، 2 مايو 2016 ، 05:43 كتب Benoit Chesneau [email protected] :

اسمحوا لي أن أعرف ما هو مطلوب هنا ، إذا كان بإمكاننا إغلاقه قبل إصدار 19.5
(أي قبل الزفاف) سيكون رائعًا :)

-
أنت تتلقى هذا لأنك قمت بتعديل حالة الفتح / الإغلاق.
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/benoitc/gunicorn/issues/1114#issuecomment -216225302

دعونا ننسى الإصدار 3.x الآن. ما هو الثابت المطلوب إضافته لدعمه على جميع إصدارات Python؟

إليك إثبات المفهوم: https://github.com/benoitc/gunicorn/pull/1454

هل من الممكن تحديد إصدارات مختلفة من TLS لتمكينها أو تعطيلها؟ على سبيل المثال ، من الشائع أن تكون قادرًا على تعطيل أو تمكين الإصدارات الأقدم. ليس من الواضح بالنسبة لي من الوثائق ما إذا كان يمكن استخدام "--ssl-version" لتعطيل الإصدارات القديمة أو ما إذا كان يمكن استخدامه أكثر من مرة (على سبيل المثال تعطيل SSL3 وتعطيل TLS1.0).

أعتقد أن هذا سيتطلب التبديل لاستخدام SSLContext وإضافة خيار جديد --ssl-options (ربما نستخدم ssl.create_default_context() لذا سيتم تعطيل SSLv3 و TLS 1.0 افتراضيًا) منذ ذلك الحين هي مجموعات كثيرة جدًا لا أعتقد أن --ssl-version سيقبلها باسم ثابت ولكن لا يزال بإمكان المستخدمين وضعها في ملف تكوين Gunicorn:

ssl_options = ssl.OP_NO_COMPRESSION | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3

يبدو أن استخدام PROTOCOL_ * لتحديد كلاً من البروتوكول _ والإصدار الدقيق_ أصبح مهملاً. بافتراض أن ssl_options لم يتم تنفيذه حاليًا ، فقد طرحت # 1680.

1890 تم إصلاحه.

ربما شخص ما قد يكون لديه بعض التوجيه لي؟ لقد كنت أعاني من هذا منذ فترة حتى الآن. ها هي بيئتي:

Python 3.4.3
gunicorn==19.9.0
pyOpenSSL==18.0.0
cryptography==2.4.2

أنا أستخدم أيضًا علامة gunicorn --ssl-version 5

يبدو أن خادمي يقدم TLS 1.2 ، لكنه يسمح بعدد كبير من مجموعات التشفير غير الآمنة. كيف يمكنني تحديد مجموعات التشفير؟ جربت العلم --ciphers ، لكن لم يحالفني الحظ في ذلك.

شكرا!

--ssl-version 5 --ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256
تعمل بشكل جيد:

~ # openssl s_client -connect Localhost : 443 -cipher ECDHE-RSA-AES256-GCM-SHA384
متصل (00000003)
العمق = 3 ...

~ # openssl s_client -connect Localhost : 443 -cipher DHE-RSA-AES256-GCM-SHA384
متصل (00000003)
140497569816640: خطأ: 14094410 : إجراءات SSL فشل اتصال تنبيه sslv3

شكراlemrouch. لست متأكدًا من سبب عدم نجاح ذلك بالنسبة لي من قبل. انها تعمل بالنسبة لي الآن!

كيفية استخدام TLS 1.2 بدلاً من TLS1.0 لتطبيق Gunicorn flask؟ هل يمكن للبعض مشاركة الأمر الطرفي أو الكود الذي يجب إدخاله؟

rkbala هذا ما يبدو عليه الرمز ذي الصلة لتطبيق flask الخاص بي:

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

rkbala هذا ما يبدو عليه الرمز ذي الصلة لتطبيق flask الخاص بي:

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

pixelrebel شكرا !! سأجربها وأعلمك بذلك.

ماذا يعني هذا ssl.options | = OP_NO_ *؟

هل يمكننا تغيير الشفرات؟ أو سوف set_ciphers أعلاه تعيين تشفير عشوائي؟

rkbala لا أتذكر لماذا كانت هناك حاجة إلى استخدام طريقة البت أو العملية. قد لا يكون ضروريا ... يستحق الاختبار.

يمكنك تغيير التشفير إلى كل ما يتوافق مع TLS 1.2. في حالتي ، يوفر تطبيقي واجهة برمجة تطبيقات لـ Slack للتواصل معه. لذلك كنت بحاجة فقط لدعم استخدامات Slackbot المشفرة.

يجب أن يوضح rkbala IO أنني لا أتذكر لماذا احتجت إلى بناء الجملة هذا ، لكنني أعتقد في ذلك الوقت ، أنني كنت بحاجة إلى تحديد خيارات OP_NO_ * بشكل صريح لجعل تطبيقي يستخدم TLS1.2 فقط وليس إصدارات أقل.

rkbala لا أتذكر لماذا كانت هناك حاجة إلى استخدام طريقة البت أو العملية. قد لا يكون ضروريا ... يستحق الاختبار.

يمكنك تغيير التشفير إلى كل ما يتوافق مع TLS 1.2. في حالتي ، يوفر تطبيقي واجهة برمجة تطبيقات لـ Slack للتواصل معه. لذلك كنت بحاجة فقط لدعم استخدامات Slackbot المشفرة.

حسنا شكرا لك. أعتقد أن gunicorn يأخذ تشفير الثعبان الافتراضي إذا لم نحدد واحدًا. صحح لي إن كنت مخطئ.

هل يجعل رمز القارورة أعلاه برنامج Gunicorn لبدء تطبيق flask فقط في TLSv1.2؟ السؤال هو لأنني أريد تشغيل تطبيق flask عبر gunicorn. لقد تعلمت اليوم للتو أن الأمر الطرفي gunicorn "gunicorn —ssl-version TLSV1_2 project: app " سيبدأ تطبيق flask في tls v1.2. ما هي الطريقة الأكثر كفاءة؟

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

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

شكرًا لك pixelrebel سأستكشف هذا الجزء.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات