Une configuration HTTPS de qualité pour nginx

Comment avoir A+ sur les principaux tests TLS

Bonjour à tous !

Ajourd'hui un article assez léger sur comment bien configurer son serveur nginx, et plus particulièrement la partie HTTPS. Par défaut la configuration est correcte mais propose des protocoles connus pour être peu robustes. Nous allons donc faire du hardenning pour notre reverse proxy préféré afin que celui-ci n'utilise que ce qu'il se fait de mieux à l'heure actuelle (juin 2017).

Les sites de test

Je vais prendre pour référence les deux sites de test de sécurité HTTPS suivants :

  • SSLLabs connu pour son exigeance ;
  • CryptCheck qui est encore plus exigeant (mais moins connu).

La configuration nginx

Voici le fichier de configuration ssl.conf. Ces lignes ne déclarent pas le certificat à utiliser (celui-ci change en fonction du site que je sers) mais comment servir le HTTPS aux clients. Ce fichier est donc suffisement générique pour pouvoir être inclu après avoir déclaré le bon certificat et la clé qui va avec.

# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;


# modern configuration. tweak to your needs.
ssl_protocols TLSv1.2;
# ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; # 90 score SSL Labs
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; # 100 score SSL Labs
ssl_prefer_server_ciphers on;


ssl_dhparam        /etc/nginx/dhparam4096.pem; # openssl dhparam -out dhparam4096.pem 4096
ssl_ecdh_curve     secp384r1;

# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;

# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;

J'utilise cette configuration avec un certificat RSA 4096 bits signé par LetsEncrypt.

Les résultats

Dans le cadre de mes tests j'ai utilisé une machine EC2 sur AWS. L'adresse IP ainsi que le nom de domaine que vous verez dans les captures d'écran suivantes sont donc bidons et n'existeront sans doute plus d'ici quelques semaines.

On commence avec le plus connu et le « moins » exigeant, SSLLabs.

A+ SSLLabs, certificate 100/100 protocol support 100/100 key exchange 100/100 cipher strength 100/100

Résultat A+ pour SSLLabs avec tout à 100/100

Puis on passe ensuite à l'étape supérieure avec le sévère CryptCheck.

A+ CryptCheck, protocol 100/100 key exchange 100/100 cipher 100/100 overall 100/100

Résultat A+ pour CryptCheck avec tout à 100/100

Conclusion

On a un résultat assez sympa. Il ne faut cependant pas oublier de relativiser car la sécurité est un domaine qui bouge beaucoup.

Les critères de choix seront peut-être encore plus sévères d'ici quelques années même si du RSA 4096 bits semble assez solide. Le plus important est de ne jamais reposer sur ses acquis et de garder à l'esprit que la sécurité parfaite n'existe pas (il y en a juste des moins pires que d'autres !).

Une question ou remarque ? N'hésitez pas à me contacter en envoyant un mail à microjoe, suivi d'un arobase, puis encore microjoe et enfin un « point org ».