Mise en place du HTTPS avec letsencrypt & NginX

Aujourd’hui, il est temps de mettre en place le HTTPS sur votre site. Rien de plus simple avec letsencrypt, cette solution vous permet d’installer un certificat SSL gratuit en quelques “clics”. Elle est soutenue par tout le gratin techno, on part clairement en direction du tout secure.. et c’est pas plus mal !

On va donc se pencher sur le cas d’une installation sur nginx, pas besoin de le présenter, si tu es là c’est que tu connais ce fameux : nginx-icon sinon, tu fais semblant 🙂

Nginx est il compatible ? :

 

Vérifions en premier si la version de nginx a été installé avec le module SSL :

nginx -V

Si tu as quelques part dans les modules :

--with-http_ssl_module

C’est opé, let’s go !

MISE A JOUR : JUILLET 2016

Depuis quelques mois (je n’ai pas la date exacte), Le binaire de letsencrypt ont été renommé.
Maintenant, c’est encore plus simple :

De LetsEncrypt vers Certbot :

 

Il suffit de te rendre sur : https://certbot.eff.org/, sélectionner ton Webserver et ton Operating-system

Et de lancer la commande :

certbot certonly

Il n’est plus nécessaire de stopper le server web pour générer les certificats. Attention cependant, le domaine doit être accessible via internet pour pouvoir créer les certificats.

Letsencrypt devient Certbot

Letsencrypt devient Certbot

 

Ensuite, un petit :

certbot certonly

Il suffit de renseigner une adresse email, les domaines/sous-domaines à gérer et c’est parti.

Les paramètres Nginx restent les mêmes 😉

(Attention pour Debian 8, Il faut activer les dépôts Backport)

Installation de letsencrypt (out of date) :

On va donc installer, letstencrypt.

cd /opt
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

Déjà? La puissance.

Avant de lancer letenscrypt, on va stopper nginx avec le classic :

service nginx stop

Tu vas me dire, le serveur est Down pendant ce temps, oui mais ça va tellement vite que personne n’aura rien vu !

./letsencrypt-auto certonly -d vincent-guesne.fr -d www.vincent-guesne.fr --rsa-key-size 4096

Sélection du mode “Standalone”, dans l’écran suivant il suffira d’entrer une adresse email de contact.

installation-letsencrypt-standalone-nginx

 

Congrats. Tu peux relancer ton nginx, on fera un reload un fois les configurations SSL de nginx éditées.

congratulations-letsencrypt

Configuration de Nginx :

Un petit tour du côté des configurations de votre site : “/etc/nginx/site-enabled/votre-site.fr” ou “/etc/nginx/nginx.conf”

On va faire ça en deux étapes :

  • Configurations et optimisations de la couche SSL
  • Redirections du HTTP vers le HTTPS

Configuration :

 

C’est assez simple, il faut changer le port d’écoute de nginx en 443, ajouter les certificats fraichement générés par letsencrypt et ajouter quelques configurations pour faire tourner ça aux petits oignons. D’ailleurs, le but ultime est d’obtenir une bonne note au test : ssllabs

On va avant tout générer une clé de chiffrement par nous même (La fameuse clé de Diffie et Hellman) 

openssl dhparam -out /etc/ssl/private/dhparams.pem 4096

(Peut prendre quelques heures a générer la clef en 4096bits… )

La version avec le param -dsaparam est plus rapide (Si tu as un train à prendre) :3

sudo openssl dhparam -out /etc/ssl/private/dhparams.pem -dsaparam 4096

Ensuite, on va ajouter ces lignes aux confs :

server {

listen 443 ssl http2;

ssl_certificate /etc/letsencrypt/live/vincent-guesne.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vincent-guesne.fr/privkey.pem;
ssl_dhparam /etc/ssl/private/dhparams.pem;


ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;   

# HSTS :
add_header Strict-Transport-Security max-age=15768000;
# OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
}

Attention : Pour le fameux A+ sur SSLabs, On a ajouté le http2 dans le listen et la directive Strict Transport Security. Elles nécessitent une version de nginx à jour 😉 

 

Voila, avec ça on atteint des sommets. Ocsp stapling et HTTP Strict Transport Security configuré et des ciphers intermédiaire, résultat :

 

vincent-sslabs-resultats

Rapport HTTPS SSLabs

 

Redirections HTTP -> HTTPS :

 

On va donc rediriger le traffic venant du port 80 vers le https. juste au dessus du bloc server que l’on vient de voir. On va ajouter un nouveau bloc server :

 

server {

       listen         80;
       server_name    ton-domain.fr www.ton-domain.fr;
       return         301 https://$server_name$request_uri;

}

 

Nous voila au top ! après un “service nginx configtest” pour s’assurer de la bonne syntaxe des fichiers de configuration, tu peux reload “service nginx reload” et admirer le vert 🙂

 

On discute du renouvellement très rapidement..


   2 Comments


  1. Koikoi
      18 February 2016

    Super tuto, merci !

Leave a Reply

Your email address will not be published. Required fields are marked *