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
Respuestas:
El problema aquí es que la
Server name indication
parte 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.
fuente
Server Name Indication
Es parte del TLSClientHello
. 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.Busque un bloque de servidor que desee usar como su plantilla de negociación SSL "predeterminada". Encuentra tu línea de escucha
y agregar
default_server
al final de la líneaEsto 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.
fuente
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:
Luego verifique la conexión a través de TLSv1 mediante el comando:
Deberías obtener algo así:
fuente