Gunicorn: Добавить поддержку именованных констант в флаге --ssl-version

Созданный на 15 сент. 2015  ·  37Комментарии  ·  Источник: benoitc/gunicorn

Я использую Gunicorn с сертификатом и ключом ssl. Он обеспечивает соединение 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] [ERROR] Исключение в рабочем процессе:
Отслеживание (последний вызов последний):
Файл "/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_socketciphers = шифры)Файл "/usr/local/lib/python3.5/ssl.py", строка 690, в ** init
self._context.set_ciphers (шифры)
ssl.SSLError: ('Невозможно выбрать шифр.',)


/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 чтобы использовать наилучший доступный протокол (как для клиентов, так и для серверов).

Кроме того, я думаю, что нам следует создать исключение, если в Gunicorn 20 используются SSLv2 или SSLv3 (было бы здорово отказаться от них в следующем выпуске 19.x).

@berkerpeksag : +1:

Кто-нибудь внедрил эти изменения? Если нет, я был бы счастлив попробовать и открыть PR. Возможность установить шифр на что-то> TLSv1.0 важна для нас, и из того, что мы можем видеть, любая версия TLS выше 1 может ' t быть установленным ... по умолчанию возвращается значение 1.0 (мы пробовали те, которые перечислены в документации, и константы, перечисленные здесь, безрезультатно) - просто выводит No cipher can be selected

@AndrewJHart, это было бы здорово! :) Спасибо!

Возможно использование других версий. Вам просто нужно указать константу --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 Бенуа Шено [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

Я также использую флаг пулемета --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 : ../ ssl / record / rec_layer_s3.c : 1407: номер предупреждения SSL 40

Спасибо @lemrouch. Не знаю, почему раньше у меня это не сработало. У меня теперь работает!

Как использовать TLS 1.2 вместо TLS1.0 для приложения Gunicorn Flask? Не могли бы вы поделиться командой терминала или кодом, который нужно ввести?

@rkbala Вот как выглядит соответствующий код для моего флеш-приложения:

...
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 Вот как выглядит соответствующий код для моего флеш-приложения:

...
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. В моем случае мое приложение предоставляет API для Slack для связи с ним. Так что мне нужно было только поддержать шифр, который использует Slackbot.

@rkbala IO должен уточнить, я не помню, зачем мне был нужен этот синтаксис, но я считаю, что в то время мне нужно было явно указать параметры OP_NO_ *, чтобы мое приложение использовало только TLS1.2 и не более ранние версии.

@rkbala Я не могу вспомнить, зачем понадобилась побитовая операция

Вы можете изменить шифр на любой, совместимый с TLS 1.2. В моем случае мое приложение предоставляет API для Slack для связи с ним. Так что мне нужно было только поддержать шифр, который использует Slackbot.

Хорошо спасибо. Я думаю, что Gunicorn использует шифр Python по умолчанию, если мы его не укажем. Поправьте меня, если я ошибаюсь.

Также, заставляет ли приведенный выше код фляги запускать приложение фляги только в TLSv1.2? Вопрос в том, что я хочу запустить приложение flask через gunicorn. Я только что узнал сегодня, что команда терминала gunicorn «gunicorn —ssl-version TLSV1_2 project: app » запускает приложение flask в tls v1.2. Какой способ эффективнее?

Да, это касается только TLS 1.2. Все остальное устарело AFAIK. Я предполагаю, что они имеют тот же эффект, но я предполагаю, что использование параметров командной строки переопределяет параметры в сценарии. Я ни в коем случае не эксперт в оружии. Так что прислушайтесь к моему совету с недоверием.

Да, это касается только TLS 1.2. Все остальное устарело AFAIK. Я предполагаю, что они имеют тот же эффект, но я предполагаю, что использование параметров командной строки переопределяет параметры в сценарии. Я ни в коем случае не эксперт в оружии. Так что прислушайтесь к моему совету с недоверием.

Спасибо @pixelrebel, я исследую эту часть.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги