Gunicorn: Ajout de la prise en charge des constantes nommées dans l'indicateur --ssl-version

Créé le 15 sept. 2015  ·  37Commentaires  ·  Source: benoitc/gunicorn

J'utilise gunicorn avec un certificat et une clé ssl. Il fournit une connexion TLS 1.0. Est-il possible de configurer gunicorn pour utiliser TLS 1.2 ?

Improvement Documentation help wanted FeaturSSL - Mailing List -

Tous les 37 commentaires

Salut @rrajaravi , avez-vous essayé de définir http://docs.gunicorn.org/en/latest/settings.html#ciphers ?

cogner

Comment déterminer qu'il fonctionne ou non?

pouvons-nous clore ce problème ?

TL;DR
Gunicorn ne semble prendre en charge que :
TLSv1
SSLv2

Et ne supporte pas :
SSLv3
SSLv23
TLSv1_1
TLSv1_2

@berkerpeksag Les documents sur http://docs.gunicorn.org/en/latest/settings.html#ciphers ne semblent pas être corrects.
J'ai trouvé les protocoles dans ssl.py. Aucun d'entre eux, à l'exception de TLSv1 et SSLv2, ne fonctionne lorsqu'il est fourni dans une option de ligne de commande sur Ubuntu 14.04 LTS, Python 3.5.1, OpenSSL 1.0.1f 6 janvier 2014

Le reste échoue avec l'erreur :
[2016-03-22 08:51:49 +0000] [2924] [ERREUR] Exception dans le processus de travail :
Traceback (appel le plus récent en dernier) :
Fichier "/home/me/Envs/myproject/lib/python3.5/site-packages/gunicorn/workers/sync.py", ligne 126, dans le handle
self.cfg.ssl_options)Fichier "/usr/local/lib/python3.5/ssl.py", ligne 1064, dans wrap_socketchiffrements=chiffres)Fichier "/usr/local/lib/python3.5/ssl.py", ligne 690, dans **init
self._context.set_ciphers(chiffres)
ssl.SSLError : ('Aucun chiffrement ne peut être sélectionné.',)


/usr/local/lib/python3.5/ssl.py
Les constantes suivantes identifient différentes variantes du protocole SSL :

PROTOCOLE_SSLv2
PROTOCOLE_SSLv3
PROTOCOLE_SSLv23
PROTOCOLE_TLSv1
PROTOCOLE_TLSv1_1
PROTOCOLE_TLSv1_2

Merci d'avoir trié ceci, @edwardotis. Je rouvre ceci pour clarifier la documentation.

@berkerpeksag utilisons -nous également la bonne valeur par défaut ?

TLSv1 semble bien pour les anciennes versions de Python, mais nous pouvons peut-être changer la valeur par défaut en SSLv23 pour utiliser le meilleur protocole disponible (à la fois pour les clients et les serveurs).

De plus, je pense que nous devrions lever une exception si SSLv2 ou SSLv3 est utilisé dans Gunicorn 20 (ce serait bien de les déprécier dans la prochaine version 19.x).

@berkerpeksag : +1:

Quelqu'un a-t-il implémenté ces changements ? Sinon, je serais heureux d'essayer et d'ouvrir un PR.. Être capable de définir le chiffrement sur quelque chose > TLSv1.0 est important pour nous et d'après ce que nous pouvons voir, toute version de TLS supérieure à 1 peut ' t être défini .. il revient par défaut à 1.0 (nous avons essayé ceux répertoriés dans la documentation et les constantes répertoriées ici en vain) - ne génère que No cipher can be selected

@AndrewJHart ce serait génial ! :) Merci!

Il est possible d'utiliser d'autres versions. Il vous suffit de spécifier une constante à --ssl-version sur la ligne de commande. Ces constantes proviennent du module ssl stdlib.

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

Spécifiez simplement --ssl-version 2 ou --ssl-version 5 et vous devriez avoir la prise en charge du chiffrement TLS 1.2.

@AndrewJHart jetez un œil à #1440 si vous souhaitez apporter des améliorations à SSL. Nous devrions passer à l'utilisation de SSLContext pour un meilleur contrôle du contexte, comme la définition de la préférence d'ordre de chiffrement du serveur. Je publierai momentanément un diff sur ce problème avec un exemple de démarrage de l'implémentation pour le travailleur de synchronisation. Toute aide pour améliorer le support SSL serait grandement appréciée.

De plus, une simple demande d'extraction pour modifier la valeur par défaut dans gunicorn/config.py pour utiliser la constante SSLv23 au lieu de TLSv1 serait formidable.

Désolé, je voulais dire #1140

Je ne comprends pas pourquoi ce sujet a été rouvert. J'ai testé Gunicorn avec --ssl-version 2 et j'ai trouvé que les chiffrements TLS 1.2 fonctionnaient bien.

Je vais fermer, mais veuillez rouvrir et expliquer si vous pensez que je l'ai fait par erreur.

J'ai ouvert #1249 pour suivre la modification de la valeur par défaut.

Je l'ai rouvert car :

a) Les utilisateurs devraient pouvoir passer 'SSLv23' ou 'TLSv1_2' au lieu de 2 , ou 5 .
b) Nous devrions documenter les options disponibles au lieu de les rediriger vers les documents Python. https://docs.python.org/3.5/library/ssl.html est l'un des documents les plus longs de la stdlib et les utilisateurs ne devraient pas passer trop de temps à voir quelles options sont disponibles.

Ré-ouvert, ajoutant les étiquettes de documentation.

faites-moi savoir ce qui est nécessaire ici, si nous pouvons le fermer avant une version 19.5 (c'est-à-dire avant mercredi), ce serait cool :)

Ceci est toujours ouvert pour fournir uniquement un support pour les constantes nommées dans le
--ssl-version indicateur.

Le lundi 2 mai 2016, 05:43 Benoit Chesneau [email protected] a écrit :

faites-moi savoir ce qui est nécessaire ici, si nous pouvons le fermer avant une version 19.5
(c'est-à-dire avant le mercredi) serait cool :)

-
Vous recevez ceci parce que vous avez modifié l'état ouvert/fermé.
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/benoitc/gunicorn/issues/1114#issuecomment -216225302

oublions la version 3.x pour l'instant. Quelles constantes faut-il ajouter pour la prendre en charge sur toutes les versions de python ?

Voici une preuve de concept : https://github.com/benoitc/gunicorn/pull/1454

Est-il possible d'activer ou de désactiver différentes versions spécifiques de TLS ? Par exemple, il est courant de vouloir pouvoir désactiver ou activer les anciennes versions. Il n'est pas clair pour moi d'après la documentation si "--ssl-version" peut être utilisé pour désactiver les anciennes versions ou s'il peut être utilisé plus d'une fois (par exemple, désactiver SSL3 et désactiver TLS1.0).

Je pense que cela nécessiterait de passer à l'utilisation de SSLContext et d'ajouter une nouvelle option --ssl-options (nous utiliserons probablement simplement ssl.create_default_context() donc SSLv3 et TLS 1.0 seront désactivés par défaut) y a trop de combinaisons, je ne pense pas que --ssl-version accepterait une constante nommée, mais les utilisateurs peuvent toujours la mettre dans un fichier de configuration Gunicorn :

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

L'utilisation de PROTOCOL_ * pour spécifier à la fois le protocole _et la version exacte_ semble être de plus en plus obsolète. En supposant que ssl_options n'est pas actuellement implémenté, j'ai levé #1680.

1890 l'a corrigé.

Peut-être que quelqu'un aura des conseils pour moi ? Cela fait un moment que je me bats avec ça. Voici mon environnement :

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

J'utilise aussi le drapeau gunicorn --ssl-version 5

Mon serveur semble servir TLS 1.2, mais il autorise une tonne de suites de chiffrement non sécurisées. Comment puis-je limiter les suites de chiffrement ? J'ai essayé le drapeau --ciphers , mais sans succès.

Merci!

--ssl-version 5 --ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256
fonctionne très bien :

~# openssl s_client -connect localhost:443 -cipher ECDHE-RSA-AES256-GCM-SHA384
CONNECTÉ(00000003)
profondeur=3...

~# openssl s_client -connect localhost:443 -cipher DHE-RSA-AES256-GCM-SHA384
CONNECTÉ(00000003)
140497569816640 : erreur : 14094410 : routines SSL échec de la prise de contact d'alerte ../ssl/record/rec_layer_s3.c : 1407 : numéro d'alerte SSL 40

Merci @lemrouch. Je ne sais pas pourquoi cela n'a pas fonctionné pour moi avant. ça marche pour moi maintenant!

Comment utiliser TLS 1.2 au lieu de TLS1.0 pour l'application de flasque gunicorn ? Certains pourraient-ils partager la commande ou le code du terminal qui doit être inséré?

@rkbala Voici à quoi ressemble le code correspondant pour mon application de flacon :

...
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 Voici à quoi ressemble le code correspondant pour mon application de flacon :

...
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 Merci !! Je vais essayer et je vous tiens au courant.

Que signifie ce ssl.options |=OP_NO_* ?

Peut-on changer de chiffrement ? Ou les set_ciphers ci-dessus définiront un chiffrement aléatoire ?

@rkbala Je ne me souviens pas pourquoi l'opération

Vous pouvez changer le chiffrement en tout ce qui est compatible avec TLS 1.2. Dans mon cas, mon application fournit une API à Slack pour communiquer avec elle. Je n'avais donc besoin que de prendre en charge le chiffrement utilisé par Slackbot.

@rkbala IO devrait préciser que je ne me souviens pas pourquoi j'avais besoin de cette syntaxe, mais je pense qu'à l'époque, je devais spécifier explicitement les options OP_NO_* pour que mon application n'utilise que TLS1.2 et aucune version inférieure.

@rkbala Je ne me souviens pas pourquoi l'opération

Vous pouvez changer le chiffrement en tout ce qui est compatible avec TLS 1.2. Dans mon cas, mon application fournit une API à Slack pour communiquer avec elle. Je n'avais donc besoin que de prendre en charge le chiffrement utilisé par Slackbot.

D'accord, merci. Je pense que gunicorn prend le chiffrement python par défaut si nous n'en spécifions pas. Corrigez-moi si je me trompe.

Le code de flacon ci-dessus permet-il également à gunicorn de démarrer l'application de flacon uniquement dans TLSv1.2 ? La question est parce que je veux exécuter l'application Flask via gunicorn. Je viens d'apprendre aujourd'hui que la commande du terminal gunicorn « gunicorn —ssl-version TLSV1_2 project:app » démarrera l'application flask dans tls v1.2. Quelle voie est la plus efficace ?

Oui, cela ne fait que TLS 1.2. Tout le reste est obsolète AFAIK. Je suppose qu'ils ont le même effet, mais je suppose que l'utilisation d'options de ligne de commande remplace les options du script. Je ne suis en aucun cas un expert en gunicorn. Alors suivez mon conseil avec un grain de sel.

Oui, cela ne fait que TLS 1.2. Tout le reste est obsolète AFAIK. Je suppose qu'ils ont le même effet, mais je suppose que l'utilisation d'options de ligne de commande remplace les options du script. Je ne suis en aucun cas un expert en gunicorn. Alors suivez mon conseil avec un grain de sel.

Merci @pixelrebel je vais explorer sur cette partie.

Cette page vous a été utile?
0 / 5 - 0 notes