Disabilita TLS 1.0 in NGINX


22

Ho un NGINX che funge da proxy inverso per i nostri siti e funziona molto bene. Per i siti che richiedono SSL ho seguito raymii.org per essere sicuro di avere il punteggio SSLLabs più forte possibile. Uno dei siti deve essere conforme allo standard PCI DSS, ma in base all'ultima scansione TrustWave ora non riesce a causa dell'attivazione di TLS 1.0.

A livello http in nginx.conf ho:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Per il server specifico ho:

ssl_protocols TLSv1.1 TLSv1.2;

Ho modificato le cifre, spostato le cose fuori dal livello http e su ciascun server del sito ssl, ma a prescindere da ciò che eseguo:

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

Ottengo una connessione valida per TLS 1.0. SSLLabs mette la configurazione di nginx per il sito come A ma con TLS 1.0 quindi credo che il resto della mia configurazione sia corretta, semplicemente non disattiverà TLS 1.0.

Pensi su cosa potrei perdere?

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

1
Si noti che non è obbligatorio rimuovere TLS 1.0 fino al 30 giugno 2016.
Michael Hampton

Risposte:


12

Il problema qui è che la Server name indicationparte della negoziazione TLS viene eseguita dopo che la connessione stessa è stata negoziata. E il protocollo viene negoziato durante la negoziazione della connessione.

Potrebbe essere possibile non applicare TLS v1.0 per quell'host virtuale se si configura quell'host virtuale su un indirizzo IP sul server a cui non sono associati altri host virtuali. Pertanto nginx saprebbe in base all'indirizzo IP che non è consentito TLS v 1.0.


Grazie. Non sto assumendo alcun modo per aggirare questo dato che al momento non abbiamo un IP di riserva per provarlo.
Shawn C.

1
Server Name Indicationfa parte del TLS ClientHello. È nel primo messaggio inviato dal client e non negoziato in seguito. Sembra più che Nginx abbia un difetto di progettazione. sembra che accetti la connessione e quindi inoltra all'host virtuale se è giusto o sbagliato. Invece, nginx dovrebbe analizzare il nome del server, consultare l'host virtuale e quindi rifiutare la connessione se non soddisfa i requisiti dell'host virtuale. Il difetto di progettazione è probabilmente degno di CVE poiché TLS 1.0 è talvolta discutibile. È chiaramente una violazione di C&A in alcune circostanze.

Grazie per il commento. Questo è interessante se è davvero un vero difetto di design.
Tero Kilkanen,

1
È rimasto invariato nel 2019 con le versioni nginx più recenti?
robsch,

18

Vai a trovare un blocco server che desideri utilizzare come modello di negoziazione SSL "predefinito". Trova la tua linea di ascolto

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

e aggiungere default_serveralla fine della riga

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

Ciò consente a nginx di avere una configurazione durante la negoziazione della versione di TLS da utilizzare. Il rovescio della medaglia è che puoi avere un solo server predefinito per porta. Quindi avere alcuni domini virtuali con TLSv1 abilitato e altri con esso disabilitato non è un problema.


Ciò significa che esiste un solo posto in cui ssl_protocolls ha un effetto? All'interno della configurazione del server che ha la dichiarazione default_server? Quando questa configurazione viene utilizzata durante la negoziazione, l'impostazione ssl_protocolls all'interno di un'altra configurazione non ha effetto?
robsch,

4

Ho disabilitato TLSv1 su nginx versione 1.8.1. Devi aggiornare openssl alle versioni 1.0.1g o 1.0.1h. Quindi rimuovere semplicemente 'TLSv1' dalla direttiva ssl_protocols:

ssl_protocols TLSv1.1 TLSv1.2

Quindi controllare la connessione tramite TLSv1 mediante il comando:

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

Dovresti ottenere qualcosa del genere:

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)
---

1
Le persone di solito non possono sostituire la versione di OpenSSL quando si trovano in un ambiente ospitato. L'operatore del server controlla la configurazione del server; non l'operatore del sito Web che sta noleggiando il server virtuale.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.