Gestion des certificats SSL avec Let’s Encrypt

Let’s Encrypt est vraiment un service génial, il vous permet gratuitement de disposer d’un certificat SSL et donc d’avoir un cadenas vert dans la barre de navigation. Outre le coté esthétique, le ranking SEO/Google il permet d’éviter de sécuriser les attaques de type MITM (Man In The Middle) enfin … sur le papier.

Dans cet article on va aborder l’installation de certification sur un site servi par Nginx sur CentOs.

[cyklodev_summary]

Pre requis :

  • Nginx déjà installé sur votre serveur
  • un enregistrement DNS (A/CNAME) qui ai la même IP publique que la machine sur laquelle vous allez faire la requête
  • les ports 80 et 443 ouverts sur votre firewall

Installation de Let’s Encrypt

On commence par installer les paquets.

yum install openssl certbot

Ensuite on met en place les répertoires qui serviront a stocker les challenges des certificats.

mkdir -p /var/lib/letsencrypt/.well-known
chgrp nginx /var/lib/letsencrypt
chmod g+s /var/lib/letsencrypt
mkdir /etc/nginx/snippets

Pour se faciliter la vie on va également créer des snippets pour ne pas surcharger les vhosts de Nginx.

On commence par un snippet pour letsencrypt.

vi /etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}

On ajoute également un snippet pour les paramètres ssl/tls.

vi /etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

La configuration d’un site sur Nginx

Un site web est servi par le port 80 (http) et 443 (ssl/tls), on va donc le définir comme cela pour l’instant :

vi /etc/nginx/site-enabled/website.roxy.com
server {
    listen 80;
    server_name website.roxy.com;

    include snippets/letsencrypt.conf;
}

On reload Nginx pour prendre en compte le fichier du vhost.

systemctl reload nginx

La requête du certificat

L’obtention du précieux certificat se fait par défaut avec un http challenge.

Pour être plus clair, Let’s Encrypt dépose un fichier dans le webroot puis fait une requête http (port 80) pour lire ce même fichier.

S’il retrouve ses petits, il accepte le challenge et génère le certificat.

/opt/letsencrypt/certbot-auto certonly --agree-tos --email support@roxy.com --webroot -w /var/lib/letsencrypt/ -d website.roxy.com

A la 1ere demande du certificat il est donc nécessaire que ca soit le port 80 qui réponde. Et vous devriez avoir ces 3 fichiers

/etc/letsencrypt/live/website.roxy.com/fullchain.pem
/etc/letsencrypt/live/website.roxy.com/privkey.pem
/etc/letsencrypt/live/website.roxy.com/chain.pem

Ajout du SSL dans Nginx

Maintenant qu’on a les certificats il reste uniquement à rajouter les directives SSL dans le vhost comme ceci

server {
    listen 80;
    server_name website.roxy.com;

    include snippets/letsencrypt.conf;
    return 301 https://$server_name$request_uri;
}
server {

    listen 443 ssl http2;
    server_name website.roxy.com;

    include snippets/letsencrypt.conf;
    include snippets/ssl.conf;

    ssl_certificate /etc/letsencrypt/live/website.roxy.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/website.roxy.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/website.roxy.com/chain.pem;

    # Proxy log file
    access_log  /var/log/nginx/website.roxy.com.access.log main;
    error_log  /var/log/nginx/website.roxy.com.error.log warn;

    root /usr/share/nginx/html/;
    index  index.htlm;
    location / {
    	try_files /index.html =404;
    }
}

On pourra remarque la redirection 301 dans le bloc http qui bascule automatiquement le client en https, ainsi que les 3 fichiers du certificat qui sont chargés.

Vérification de la durée de validité du certificat

Les certificats Let’s Encrypt sont valides pour 90 jours. On peut vérifier ça avec la commande suivante.

[root@webserver ~]# /opt/letsencrypt/certbot-auto certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: website.roxy.com
    Domains: website.roxy.com
    Expiry Date: 2019-08-11 05:57:13+00:00 (VALID: 87 days)
    Certificate Path: /etc/letsencrypt/live/website.roxy.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/website.roxy.com/privkey.pem

Renouveler un certificat

Pour renouveler le certificat il vous suffit de lancer une nouvelle requête.

/opt/letsencrypt/certbot-auto renew

Cela vous permettra de renouvellement tous les certificats ssl de Let’s Encrypt sur le serveur. Attention à 2 choses:

  • Le certificat ne sera renouveler que si sa validité est inférieure à 29 jours
  • Vous n’avez droits qu’a 5 essais de renouvellement par jour.

Pour éviter ce dernier écueil vous pouvez utiliser le mode dry-run et vérifier que vous n’avez pas d’erreur comme ceci :

/opt/letsencrypt/certbot-auto renew --dry-run

Zephilou

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Post comment