Désactiver TLS 1.0 dans NGINX

22

J'ai un NGINX agissant en tant que proxy inverse pour nos sites et fonctionne très bien. Pour les sites qui ont besoin de SSL, j'ai suivi raymii.org pour m'assurer d'avoir un score SSLLabs aussi fort que possible. L'un des sites doit être conforme à la norme PCI DSS mais sur la base de la dernière analyse TrustWave échoue maintenant en raison de l'activation de TLS 1.0.

Au niveau http dans nginx.conf, j'ai:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Pour le serveur spécifique que j'ai:

ssl_protocols TLSv1.1 TLSv1.2;

J'ai changé de chiffrement, déplacé des choses hors du niveau http et vers chaque serveur de site ssl mais peu importe quand je lance:

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

J'obtiens une connexion valide pour TLS 1.0. SSLLabs définit la configuration nginx pour le site comme un A, mais avec TLS 1.0, je pense donc que le reste de ma configuration est correcte, il ne désactivera tout simplement pas TLS 1.0.

Réflexions sur ce que je pourrais manquer?

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.
la source
1
Notez qu'il n'est pas obligatoire de supprimer TLS 1.0 jusqu'au 30 juin 2016.
Michael Hampton

Réponses:

12

Le problème ici est que la Server name indicationpartie de la négociation TLS se fait après que la connexion elle-même a été négociée. Et le protocole est négocié lors de la négociation de la connexion.

Il peut être possible d'appliquer aucun TLS v1.0 pour cet hôte virtuel si vous configurez cet hôte virtuel sur une adresse IP sur le serveur qui n'a aucun autre hôte virtuel associé. Par conséquent, nginx saurait, sur la base de l'adresse IP, qu'aucun TLS v 1.0 n'est autorisé.

Tero Kilkanen
la source
Merci. Je pars du principe que nous n'avons pas d'IP de rechange pour le moment.
Shawn C.
1
Server Name Indicationfait partie du TLS ClientHello. C'est dans le premier message envoyé par le client, et non négocié plus tard. Cela ressemble plus à Nginx a un défaut de conception. il semble qu'il accepte la connexion, puis transmet à l'hôte virtuel que ce soit bon ou mauvais. Au lieu de cela, nginx doit analyser le nom du serveur, consulter l'hôte virtuel, puis rejeter la connexion si elle ne répond pas aux exigences de l'hôte virtuel. Le défaut de conception est probablement digne de CVE car TLS 1.0 est parfois discutable. C'est clairement une violation de C&A dans certaines circonstances.
Merci pour le commentaire. C'est intéressant s'il s'agit vraiment d'un vrai défaut de conception.
Tero Kilkanen
1
Est-ce inchangé en 2019 avec les nouvelles versions de nginx?
robsch
18

Allez trouver un bloc serveur que vous souhaitez utiliser comme modèle de négociation SSL "par défaut". Trouvez votre ligne d'écoute

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

et ajouter default_serverà la fin de la ligne

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

Cela permet à nginx d'avoir une configuration lors de la négociation de la version TLS à utiliser. L'inconvénient est que vous ne pouvez avoir qu'un seul serveur par défaut par port. Il est donc impossible d'avoir certains domaines virtuels avec TLSv1 activé et d'autres désactivés.

Thego Rilla
la source
Est-ce à dire qu'il n'y a qu'un seul endroit où ssl_protocolls a un effet? Dans la configuration du serveur qui a la déclaration default_server? Lorsque cette configuration est utilisée pendant la négociation, le paramètre ssl_protocolls dans une autre configuration n'a pas d'effet?
robsch
4

J'ai désactivé TLSv1 sur la version 1.8.1 de nginx. Vous devez mettre à jour openssl vers les versions 1.0.1g ou 1.0.1h. Ensuite, supprimez simplement 'TLSv1' de la directive ssl_protocols:

ssl_protocols TLSv1.1 TLSv1.2

Vérifiez ensuite la connexion via TLSv1 par commande:

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

Vous devriez obtenir quelque chose comme ça:

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
la source
1
Les gens ne peuvent généralement pas remplacer la version d'OpenSSL lorsqu'ils se trouvent dans un environnement hébergé. L'opérateur du serveur contrôle la configuration du serveur; pas l'opérateur du site Web qui loue le serveur virtuel.