Desativar TLS 1.0 no NGINX

22

Eu tenho um NGINX atuando como um proxy reverso para nossos sites e está funcionando muito bem. Para os sites que precisam de ssl, segui o raymii.org para garantir uma pontuação o mais forte possível no SSLLabs. Um dos sites precisa estar em conformidade com o PCI DSS, mas com base na varredura TrustWave mais recente agora está falhando devido à ativação do TLS 1.0.

No nível http no nginx.conf, tenho:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Para o servidor específico, eu tenho:

ssl_protocols TLSv1.1 TLSv1.2;

Alterei as cifras, movi as coisas para fora do nível http e para cada servidor do site SSL, mas não importa o que eu execute:

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

Eu recebo uma conexão válida para o TLS 1.0. O SSLLabs coloca a configuração nginx para o site como A, mas com o TLS 1.0, então acredito que o restante da minha configuração esteja correta, mas não desativará o TLS 1.0.

Pensamentos sobre o que eu poderia estar perdendo?

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.
fonte
1
Observe que não é obrigatório remover o TLS 1.0 até 30 de junho de 2016.
Michael Hampton

Respostas:

12

O problema aqui é que a Server name indicationparte da negociação do TLS é feita após a negociação da conexão. E o protocolo é negociado durante a negociação da conexão.

Pode ser possível impor nenhum TLS v1.0 para esse host virtual se você configurar esse host virtual para um endereço IP no servidor que não possui outros hosts virtuais associados a ele. Portanto, o nginx saberia, com base no endereço IP, que nenhum TLS v 1.0 é permitido.

Tero Kilkanen
fonte
Obrigado. Estou assumindo que não há maneira de contornar isso, pois não temos um IP disponível no momento para testar isso.
Shawn C.
1
Server Name Indicationfaz parte do TLS ClientHello. Está na primeira mensagem enviada pelo cliente e não é negociada posteriormente. Parece mais que o Nginx tem uma falha de design. parece que aceita a conexão e, em seguida, encaminha para o host virtual, certo ou errado. Em vez disso, o nginx deve analisar o nome do servidor, consultar o host virtual e, em seguida, rejeitar a conexão se ele não atender aos requisitos do host virtual. A falha de design provavelmente é digna de CVE, já que o TLS 1.0 é questionável às vezes. É claramente uma violação da C&A em algumas circunstâncias.
Obrigado pelo comentário. Isso é interessante se realmente é uma falha de design real.
Tero Kilkanen 2/11
1
Isso permanece inalterado em 2019 com as versões mais recentes do nginx?
robsch 18/02
18

Vá encontrar um bloco de servidor que você deseja usar como modelo de negociação SSL "padrão". Encontre sua linha de escuta

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

e adicione default_serverno final da linha

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

Isso permite que o nginx tenha uma configuração ao negociar qual versão do TLS usar. A desvantagem é que você pode ter apenas um servidor padrão por porta. Portanto, ter alguns domínios virtuais com o TLSv1 ativado e outros desativados não é possível.

Thego Rilla
fonte
Isso significa que existe apenas um único local em que ssl_protocolls tem efeito? Na configuração do servidor que possui a declaração default_server? Quando essa configuração é usada durante a negociação, a configuração ssl_protocolls em outra configuração não tem efeito?
robsch 18/02
4

Desativei o TLSv1 no nginx versão 1.8.1. Você precisa atualizar o openssl para as versões 1.0.1g ou 1.0.1h. Em seguida, remova simplesmente 'TLSv1' da diretiva ssl_protocols:

ssl_protocols TLSv1.1 TLSv1.2

Em seguida, verifique a conexão via TLSv1 pelo comando:

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

Você deve obter algo assim:

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
fonte
1
As pessoas geralmente não podem substituir a versão do OpenSSL quando estão em um ambiente hospedado. O operador do servidor controla a configuração do servidor; não é o operador do site que está alugando o servidor virtual.