Nous allons aborder ici un exemple de configuration rapide pour renforcer le protocole HTTPS sur ses serveurs avec NGinx. Nous n'allons pas trop élaborer les (bonnes) raisons de le faire, une liste de sites qui détaillent ces raisons et leurs contextes est indiquée dans le chapitre Références. L'objectif ici est d'obtenir la note A+ à SSLLabs.

Quelques mots sur HSTS

Introduction / Mise en garde

HSTS, implémenté avec la directive NGinx ̀add_header Strict-Transport-Security permet de forcer l'utilisation de HTTPS auprès des navigateurs modernes (cf Références).
Quand un navigateur rencontre ce header il apprend alors que le domaine ne doit seulement être accessible qu'en HTTPS (SSL ou TLS). Cette information est cachée pour une période données définie dans la directive (max-age en secondes). Autrement dit, une fois ce paramètre postionné il est très très difficile de revenir en arrière!

HSTS avec NGinx

Pour utiliser HSTS avec NGinx, il suffit d'ajouter la ligne suivante dans son fichier de configuration:

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; ";  

Ici max-age vaut 31536000 secondes soit une année.

Cependant, si un bloc location de configuration NGinx, contient la directive add_header, il faut répéter la ligne add_header Strict-Transport-Security .

Ainsi si l'on a par exemple

 location /quelquechose
   add_header X-Served-By "Mon truc à moi";
   ...

il faut répéter:

 location /quelquechose
   add_header X-Served-By "Mon truc à moi";
   add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; ";
   ...

cf HTTP Strict Transport Security (HSTS) and NGINX - NGINX

Paramètre DHE

Toutes les versions de nginx depuis 1.4.4 se repose surOpenSSL pour les parazmètres Diffie-Hellman (DH). Malheureusement, cela signifie quye Ephemeral Diffie-Hellman (DHE) va utiliser les paramètres par défait de OpenSSL, soit une clé de 1024-bit pour le key-exchange. Et comme nous utilison une clé supérieure, les clients DHE vont utiliser une clé d'échange plus faible que les non-ephemeral clients.

Renforcer le paramètre DHE

J'ai choisi de stocker la nouvelle clé DHE dans /etc/letsencrypt/certs. La génération de la clé à un niveau 4096 prend quelques minutes...

mkdir /etc/letsencrypt/certs  
openssl dhparam -out /etc/letsencrypt/certs/dhparam.pem 4096  

Indiquer à NGinx d'utiliser cette clé (cf ci-dessous pour un exemple complet):

ssl_dhparam /etc/ssl/certs/dhparam.pem;  

Exemple complet

On peut créer par exemple un fichier de configuration /etc/nginx/ssl_params (ou ajouter les directives ci-dessous dans le fichier de configuration global).

ssl on;  
ssl_session_timeout 5m;  
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";  
ssl_session_cache shared:SSL:50m;  
ssl_dhparam /etc/letsencrypt/certs/dhparam.pem;  
ssl_prefer_server_ciphers on;  
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; ";  

Puis ensuite, dans le configuration de host où l'on souhaite l'utiliser:

server {  
    ...
    include /etc/nginx/ssl_params;
    ssl_certificate /etc/letsencrypt/live/monurl.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monurl.com/privkey.pem;
    ...

Ne pas oublier d'ajouter add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; "; dans les locations où l'on a déjà une directive add_header.

Références

https://juliansimioni.com/blog/https-on-nginx-from-zero-to-a-plus-part-1/
https://www.ssllabs.com/ssltest/analyze.html?d=ylegoff.com
https://weakdh.org/sysadmin.html
https://robmclarty.com/blog/how-to-secure-your-web-app-using-https-with-letsencrypt
https://www.mynameisvolkert.com/lets-encrypt/
https://www.information-security.fr/hsts-http-strict-transport-security-et-burpsuite/