Perfect Forward Secrecy avec Nginx

Sécurisé ?

Perfect WAT ?

Vous pensez certainement qu’utiliser HTTPS permet de mettre vos données à l’abri des oreilles indiscrètes ? C’est vrai mais jusqu’à un certain point seulement.

Il y a de nombreuses façons d’obtenir la clé privée de votre certificat (décision de justice, NSA, etc.) et alors toutes les communications qui ont été chiffrées avec celle-ci pourront être lues sans aucun souci.

Pour éviter cela, il existe une solution nommée perfect forward secrecy (ou confidentialité persistante en bon français).

Voilà ce que nous dit Wikipédia à son propos :

La confidentialité persistante (forward secrecy en anglais), est une propriété en cryptographie qui garantit que la découverte par un adversaire de la clé privée d'un correspondant (secret à long terme) ne compromet pas la confidentialité des communications passées.

Cela signifie que, même si vous avez obtenu la clé privée du serveur en soudoyant un administrateur, en la volant, ou même grâce à une décision de justice, vous ne serez pas en mesure de déchiffrer les échanges que vous auriez pu enregistrer dans le passé.

La configuration Nginx

Voilà une configuration générique qui est utilisée par tous mes vhosts. Les points importants ici sont :

  • ssl_protocols où l’on autorise seulement TLS 1.0 et supérieur ;
  • ssl_prefer_server_ciphers qui permet d’indiquer qu’on privilégie les algos du serveur plutôt que ceux du client ;
  • ssl_dhparam qui pointe vers un fichier dhparam plus robuste que celui par défaut de Nginx (4096 bits ici au lieu de 1024) ;
  • ssl_ciphers où l’on indique quels algos utiliser, dans quel ordre et lesquels rejeter.

Je n’ai pas trouvé cette configuration tout seul mais en me renseignant sur la question. L’article nommé « Configuring Apache, Nginx, and OpenSSL for Forward Secrecy » présente tout ça justement et je pense que l’auteur est bien calé sur le sujet puisque s’occupant aussi de SSL Labs.

Pour ce qui est de la ligne ssl_ciphers, j’ai utilisé la version qui exclut RC4 puisque ce dernier a été complètement cassé.

Vérification

Je parlais de SSL Labs et justement ils ont un outil pour vérifier la robustesse de sa configuration HTTPS, SSL Server Test (ça porte bien son nom ;)).

Avec cette configuration, j’obtiens le résultat suivant :
SSL Server Test global

Et pour ce qui est de PFS :
SSL Server Test PFS

Plutôt pas mal, non ? :)

Photo sous licence CC-BY-NC-ND 2.0 par James C. O’Sullivan