Gunicorn: Agregue soporte para constantes con nombre en el indicador --ssl-version

Creado en 15 sept. 2015  ·  37Comentarios  ·  Fuente: benoitc/gunicorn

Estoy usando gunicorn con ssl cert y key. Proporciona conexión TLS 1.0. ¿Es posible configurar gunicorn para usar TLS 1.2?

Improvement Documentation help wanted FeaturSSL - Mailing List -

Todos 37 comentarios

Hola @rrajaravi , ¿intentaste configurar http://docs.gunicorn.org/en/latest/settings.html#ciphers ?

protuberancia

¿Cómo determinar si funciona o no?

¿Podemos cerrar este tema?

TL; DR
Gunicorn solo parece apoyar:
TLSv1
SSLv2

Y no admite:
SSLv3
SSLv23
TLSv1_1
TLSv1_2

@berkerpeksag Los documentos en http://docs.gunicorn.org/en/latest/settings.html#ciphers no parecen ser correctos.
Encontré los protocolos en ssl.py. Ninguno de ellos, excepto TLSv1 y SSLv2, funciona cuando se proporciona en una opción de línea de comando en Ubuntu 14.04 LTS, Python 3.5.1, OpenSSL 1.0.1f 6 de enero de 2014

El resto falla con error:
[2016-03-22 08:51:49 +0000] [2924] [ERROR] Excepción en el proceso de trabajo:
Rastreo (llamadas recientes más última):
Archivo "/home/me/Envs/myproject/lib/python3.5/site-packages/gunicorn/workers/sync.py", línea 126, en el identificador
self.cfg.ssl_options)Archivo "/usr/local/lib/python3.5/ssl.py", línea 1064, en wrap_socketcifrados = cifrados)Archivo "/usr/local/lib/python3.5/ssl.py", línea 690, en ** init
self._context.set_ciphers (cifrados)
ssl.SSLError: ('No se puede seleccionar ningún cifrado.',)


/usr/local/lib/python3.5/ssl.py
Las siguientes constantes identifican varias variantes del protocolo SSL:

PROTOCOL_SSLv2
PROTOCOL_SSLv3
PROTOCOL_SSLv23
PROTOCOL_TLSv1
PROTOCOL_TLSv1_1
PROTOCOL_TLSv1_2

Gracias por evaluar esto, @edwardotis. Estoy reabriendo esto para aclarar la documentación.

@berkerpeksag también ¿estamos usando el buen valor predeterminado?

TLSv1 ve bien para versiones anteriores de Python, pero quizás podamos cambiar el valor predeterminado a SSLv23 para usar el mejor protocolo disponible (tanto para clientes como para servidores).

Además, creo que deberíamos plantear una excepción si se usa SSLv2 o SSLv3 en Gunicorn 20 (sería genial desaprobarlos en la próxima versión 19.x).

@berkerpeksag : +1:

¿Alguien ha implementado estos cambios? Si no es así, estaría feliz de intentarlo y abrir un PR. Ser capaz de establecer el cifrado en algo> TLSv1.0 es importante para nosotros y, por lo que podemos ver, cualquier versión de TLS mayor que 1 puede ' t ser configurado ... simplemente vuelve a ser predeterminado en 1.0 (probamos las que se enumeran en los documentos y las constantes que se enumeran aquí en vano) - solo genera No cipher can be selected

@AndrewJHart ¡Eso sería genial! :) ¡Gracias!

Es posible utilizar otras versiones. Solo necesita especificar una constante a --ssl-version en la línea de comando. Estas constantes provienen del módulo ssl stdlib.

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

Simplemente especifique --ssl-version 2 o --ssl-version 5 y debería tener soporte de cifrado TLS 1.2.

@AndrewJHart eche un vistazo a # 1440 si desea contribuir con algunas mejoras a SSL. Deberíamos cambiar al uso de SSLContext para un mejor control sobre el contexto, como establecer la preferencia del orden de cifrado del servidor. Publicaré una diferencia sobre ese problema momentáneamente con un ejemplo de cómo comenzar a implementar esto para el trabajador de sincronización. Cualquier ayuda para mejorar la compatibilidad con SSL será muy apreciada.

Además, una simple solicitud de extracción para cambiar el valor predeterminado en gunicorn / config.py para usar la constante SSLv23 en lugar de TLSv1 sería genial.

Lo siento, quise decir # 1140

No entiendo por qué se volvió a abrir este problema. Probé Gunicorn con --ssl-version 2 y descubrí que los cifrados TLS 1.2 funcionan bien.

Cerraré, pero vuelva a abrir y explique si cree que lo hice por error.

Abrí # 1249 para rastrear el cambio del valor predeterminado.

Lo volví a abrir porque:

a) Los usuarios deben poder pasar 'SSLv23' o 'TLSv1_2' lugar de 2 , o 5 .
b) Deberíamos documentar las opciones disponibles en lugar de redirigirlas a documentos de Python. https://docs.python.org/3.5/library/ssl.html es uno de los documentos más largos en stdlib y los usuarios no deberían perder demasiado tiempo solo para ver qué opciones están disponibles.

Reabierto, agregando las etiquetas de documentación.

déjame saber qué se necesita aquí, si podemos cerrarlo antes de una versión 19.5 (es decir, antes del matrimonio) sería genial :)

Esto todavía está abierto para proporcionar solo soporte para constantes con nombre en el
- Indicador de versiónssl.

El lunes 2 de mayo de 2016 a las 05:43, Benoit Chesneau [email protected] escribió:

avíseme qué se necesita aquí, si podemos cerrarlo antes de una versión 19.5
(es decir, antes del miércoles) sería genial :)

-
Recibe esto porque modificó el estado abierto / cerrado.
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/benoitc/gunicorn/issues/1114#issuecomment -216225302

olvidemos la versión 3.x por ahora. ¿Cuáles son las constantes necesarias para agregar para admitirlo en todas las versiones de Python?

Aquí hay una prueba de concepto: https://github.com/benoitc/gunicorn/pull/1454

¿Es posible especificar diferentes versiones de TLS para habilitar o deshabilitar? Por ejemplo, es común querer poder deshabilitar o habilitar versiones anteriores. No me queda claro de la documentación si "--ssl-version" se puede usar para deshabilitar versiones anteriores o si se puede usar más de una vez (por ejemplo, deshabilitar SSL3 y deshabilitar TLS1.0).

Creo que eso requeriría cambiar para usar SSLContext y agregar una nueva opción --ssl-options (probablemente solo usaremos ssl.create_default_context() por lo que SSLv3 y TLS 1.0 estarán deshabilitados de forma predeterminada) hay demasiadas combinaciones, no creo que --ssl-version acepte la constante nombrada, pero los usuarios aún pueden ponerla en un archivo de configuración de Gunicorn:

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

El uso de PROTOCOL_ * para especificar tanto el protocolo _y la versión exacta_ parece estar cada vez más en desuso. Suponiendo que ssl_options no está implementado actualmente, planteé # 1680.

1890 lo arregló.

¿Quizás alguien pueda tener alguna orientación para mí? He estado luchando con esto por un tiempo. Aquí está mi entorno:

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

También estoy usando la bandera gunicorn --ssl-version 5

Mi servidor parece estar sirviendo TLS 1.2, pero permite un montón de conjuntos de cifrado inseguros. ¿Cómo puedo limitar los conjuntos de cifrado? Probé la bandera --ciphers , pero no tuve suerte con eso.

¡Gracias!

--ssl-version 5 --ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256
funciona bien:

~ # openssl s_client -connect localhost: 443 -cifrar ECDHE-RSA-AES256-GCM-SHA384
CONECTADO (00000003)
profundidad = 3 ...

~ # openssl s_client -connect localhost: 443 -cifrar DHE-RSA-AES256-GCM-SHA384
CONECTADO (00000003)
140497569816640: error: 14094410 : rutinas SSL : ../ ssl / record / rec_layer_s3.c : 1407: alerta SSL número 40

Gracias @lemrouch. No estoy seguro de por qué eso no funcionó para mí antes. ¡Me está funcionando ahora!

¿Cómo usar TLS 1.2 en lugar de TLS1.0 para la aplicación del matraz gunicorn? ¿Podrían algunos compartir el comando de terminal o el código que se debe ingresar?

@rkbala Así es como se ve el código relevante para mi aplicación de matraz:

...
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 Así es como se ve el código relevante para mi aplicación de matraz:

...
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 ¡¡ Gracias !! Lo intentaré y te lo haré saber.

¿Qué significa esto ssl.options | = OP_NO_ *?

¿Podemos cambiar el cifrado? ¿O el set_ciphers anterior establecerá cifrado aleatorio?

@rkbala No puedo recordar por qué se necesitaba la operación bit a bit. Puede que no sea necesario ... vale la pena una prueba.

Puede cambiar el cifrado a lo que sea compatible con TLS 1.2. En mi caso, mi aplicación proporciona una API para que Slack se comunique con ella. Así que solo necesitaba admitir el cifrado que usa Slackbot.

@rkbala IO debería aclarar que no recuerdo por qué necesitaba esa sintaxis, pero creo que en ese momento, necesitaba especificar explícitamente las opciones OP_NO_ * para que mi aplicación solo use TLS1.2 y no versiones inferiores.

@rkbala No puedo recordar por qué se necesitaba la operación bit a bit. Puede que no sea necesario ... vale la pena una prueba.

Puede cambiar el cifrado a lo que sea compatible con TLS 1.2. En mi caso, mi aplicación proporciona una API para que Slack se comunique con ella. Así que solo necesitaba admitir el cifrado que usa Slackbot.

Ok, gracias. Creo que gunicorn toma el cifrado de Python predeterminado si no especificamos uno. Corrígeme si estoy equivocado.

¿También el código del matraz anterior hace que gunicorn inicie la aplicación del matraz solo en TLSv1.2? La pregunta es porque quiero ejecutar la aplicación de matraz a través de gunicorn. Acabo de enterarme hoy que el comando de terminal gunicorn "gunicorn —ssl-version TLSV1_2 project: app " iniciará la aplicación flask en tls v1.2. ¿Qué camino es más eficiente?

Sí, solo para TLS 1.2. Todo lo demás está en desuso AFAIK. Supongo que tienen el mismo efecto, pero supongo que el uso de opciones de línea de comando anula las opciones del script. No soy un experto con gunicorn de ninguna manera. Así que sigue mi consejo con cautela.

Sí, solo para TLS 1.2. Todo lo demás está en desuso AFAIK. Supongo que tienen el mismo efecto, pero supongo que el uso de opciones de línea de comando anula las opciones del script. No soy un experto con gunicorn de ninguna manera. Así que sigue mi consejo con cautela.

Gracias @pixelrebel , exploraré esa parte.

¿Fue útil esta página
0 / 5 - 0 calificaciones