Deshabilitar TLS 1.0 en NGINX

22

Tengo un NGINX que actúa como proxy inverso de nuestros sitios y funciona muy bien. Para los sitios que necesitan ssl, seguí a raymii.org para asegurarme de tener un puntaje SSLLabs tan fuerte como sea posible. Uno de los sitios debe ser compatible con PCI DSS pero basado en el último escaneo TrustWave ahora falla debido a que TLS 1.0 está habilitado.

En el nivel http en nginx.conf tengo:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Para el servidor específico que tengo:

ssl_protocols TLSv1.1 TLSv1.2;

He cambiado los cifrados, moví cosas fuera del nivel http y a cada servidor de sitio ssl, pero no importa qué cuando ejecuto:

openssl s_client -connect www.example.com:443 -tls1

Obtengo una conexión válida para TLS 1.0. SSLLabs pone la configuración de nginx para el sitio como A pero con TLS 1.0, así que creo que el resto de mi configuración es correcta, simplemente no apagará TLS 1.0.

¿Pensamientos sobre lo que podría estar perdiendo?

openssl version -a
OpenSSL 1.0.1f 6 Jan 2014
built on: Thu Jun 11 15:28:12 UTC 2015
platform: debian-amd64

nginx -v
nginx version: nginx/1.8.0
Shawn C.
fuente
1
Tenga en cuenta que no es obligatorio eliminar TLS 1.0 hasta el 30 de junio de 2016.
Michael Hampton

Respuestas:

12

El problema aquí es que la Server name indicationparte de la negociación TLS se realiza después de que se ha negociado la conexión en sí. Y el protocolo se negocia durante la negociación de la conexión.

Es posible que no se aplique ningún TLS v1.0 para ese host virtual si configura ese host virtual a una dirección IP en el servidor que no tiene otros hosts virtuales asociados. Por lo tanto, nginx sabría en base a la dirección IP que no se permite TLS v 1.0.

Tero Kilkanen
fuente
Gracias. Supongo que no hay forma de evitar esto, ya que no tenemos una IP de repuesto en este momento para probar eso.
Shawn C.
1
Server Name IndicationEs parte del TLS ClientHello. Está en el primer mensaje enviado por el cliente y no se negocia más tarde. Parece que Nginx tiene un defecto de diseño. parece que acepta la conexión y luego lo reenvía al host virtual si es correcto o incorrecto. En su lugar, nginx debería analizar el nombre del servidor, consultar al Virtual Host y luego rechazar la conexión si no cumple con los requisitos del Virtual Host. El defecto de diseño es probablemente digno de CVE ya que TLS 1.0 es cuestionable a veces. Es claramente una violación de C&A en algunas circunstancias.
Gracias por el comentario. Esto es interesante si realmente es una falla de diseño real.
Tero Kilkanen
1
¿Esto no ha cambiado en 2019 con las nuevas versiones de nginx?
Robsch
18

Busque un bloque de servidor que desee usar como su plantilla de negociación SSL "predeterminada". Encuentra tu línea de escucha

server {
    ...
    listen 443 ssl;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

y agregar default_serveral final de la línea

server {
    ...
    listen 443 ssl default_server;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

Esto permite que nginx tenga una configuración cuando está negociando qué versión de TLS usar. La desventaja es que solo puede tener un servidor predeterminado por puerto. Por lo tanto, tener algunos dominios virtuales con TLSv1 habilitado y otros con él deshabilitado es imposible.

El gorila
fuente
¿Eso significa que solo hay un único lugar donde ssl_protocolls tiene un efecto? ¿Dentro de la configuración del servidor que tiene la declaración default_server? Cuando esta configuración se usa durante la negociación, ¿la configuración ssl_protocolls dentro de otra configuración no tiene efecto?
Robsch
4

Inhabilité TLSv1 en nginx versión 1.8.1. Debe actualizar openssl a las versiones 1.0.1go 1.0.1h. Luego simplemente elimine 'TLSv1' de la directiva ssl_protocols:

ssl_protocols TLSv1.1 TLSv1.2

Luego verifique la conexión a través de TLSv1 mediante el comando:

openssl s_client -tls1 -connect example.com:443 < /dev/null

Deberías obtener algo así:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1474531027
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
r0den
fuente
1
La gente generalmente no puede reemplazar la versión de OpenSSL cuando están en un entorno alojado. El operador del servidor controla la configuración del servidor; no el operador del sitio web que alquila el servidor virtual.