Activer le HTTPS sur son site web avec un certificat signé par Let's Encrypt

L'ennui avec HTTPS, c'est que pour obtenir le fameux cadenas vert à gauche de l'url de son site, il faut un certificat signé par une Autorité de Certification connue de son navigateur Internet. Et c'est là qu'intervient Let's Encrypt. Dans cette article, je vous explique comment j'ai pu mettre en place le HTTPS sur ce blog, obtenir mon certificat et le maintenir à jour, le tout gratuitement et de manière automatique. Vous verrez également comment paramétrer NGINX pour faire fonctionner le tout avec PluXml.

HTTPS est l'accronyme qui désigne l'utilisation des protocoles SSL au sein du protocole HTTP. Il vous permet de chiffrer la communication entre votre navigateur et le site web que vous consultez. Imaginez-vous sur un site de e-commerce. Vous devez saisir votre numéro de carte bancaire ainsi que les autres informations nécessaires au paiement. Sans HTTPS, toutes ces données sont transmises au site en clair. Cela signifie, qu'elles vont circuler sur le réseau local et sur Internet de manière totalement lisible par d'autres. Ainsi une personne tierce qui "lit" ce qui passe sur le réseau, peut récupérer les informations de votre carte bancaire. Il en va de même pour les logins et mots de passe de votre webmail ou encore lorsque vous communiquez via une messagerie instantanée ou bien sur un forum il est possible d'intercepter les messages. Une connexion chiffrée permet d'éviter ces problèmes, en rendant illisible tout ce que vous envoyez depuis votre navigateur. De plus, le chiffrement de vos communications permet de garantir l'intégrité des échanges, vous êtes ainsi assuré que les données n'ont pas été modifiée par un tiers au cours de leur tranversée du réseau. Le passage à HTTPS peut également être motivés par trois autres facteurs : depuis 2014 Google favorise le référencement des sites web qui proposent du HTTPS ; les navigateurs Chrome et Firefox à partir de janvier 2017 affichent des messages d'alertes directement dans les formulaires (login, mot de passe, carte de crédit) des pages HTTP ; Enfin, le protocole HTTP/2 a pour prérequis d'utiliser HTTPS. Ainsi, depuis 2017 bon nombre sites, dont mon blog, proposent par défaut le https.


Les deux font la paire

Avant de mettre en place ce fameux HTTPS,  il faut d'abord comprendre comment ça fonctionne. SSL utilise trois éléments. Un système de chiffrement asymétrique (RSA, par exemple) qui permet de générer une paire de clés (une clé privée et une clé publique), un système de chiffrement symétrique pour les données (AES , par exemple) et enfin un système de signature (SHA, par exemple), pour vérifier l'intégrité des données. Lorsque que le client et le serveur (le navigateur et le site web) veulent communiquer via HTTPS, ils choisissent les systèmes communs qu'ils vont utiliser. Il est d'ailleurs possible d'en voir la liste en cliquant sur le cadenas du navigateur.

Dernier point de la chaîne, le certificat. Celui-ci est fourni au visiteur par le site web. Il permet de s'assurer que le serveur qui vous répond est bien celui qu'il prétend être. Le certificat fourni un ensemble d'information dont les PKI. Ce sont des clés publics fournis par des autorités de certification dont la liste est enregistrée dans la navigateur. C'est là qu'intervient Let's Encrypt, une autorité de certification qui fournies gratuitement et de manière automatique des certificats. Avec l'aide de Mozilla, l'Electronic Frontier Foundation (EFF) et l'université du Michigan, Let's Encrypt utilise une implémentation serveur et client sous licence libre. Tout le projet est disponible sous Github, facilitant les démarches d'audits et laissant la place à un travail collaboratif d'amélioration continue. En pratique, pour fonctionner sur tous les navigateurs, Let's Encrypt va signer vos certificats avec un certificat intermédiaire. Celui-ci, est lui même signé par le certificat racine de Let's Encrypt, mais aussi par le certificat racine de l'Autorité de Certification IdenTrust qui est connue de tous les navigateurs Internet.


La clé du succès

Commençons directement par l'obtention de notre certificat. Pour cela les développeurs de Let's Encrypt ont créé le protocole ACME. Il permet entre autre, au travers de messages JSON échangés en HTTPS avec l'autorité de certification, de créer votre compte, d'enregistrer votre nom de domaine et d'obtenir votre certificat.

Let's Encrypt recommande d'utiliser un client ACME développé par l'Electronic Frontier Foundation : Certbot. Une liste de clients est disponibles ici : https://letsencrypt.org/docs/client-options/

L'installation de Certbot, passe par la copie du dépôt git.

git clone https://github.com/certbot/certbot.git
cd certbot

Pour dialoguer avec notre autorité de certification, nous allons utiliser le script : certbot-auto. La commande ci-dessous va nous permettre de créer un compte, de vérifier que le nom domaine nous appartient bien, puis de créer le certificat.

sudo ./certbot-auto certonly --webroot --webroot-path /srv/web/p3ter.fr --domains p3ter.fr,www.p3ter.fr --agree-tos --text --email contact@p3ter.fr

--webroot : l'authentification de votre site sera réalisée par un challenge ACME. Un fichier fourni par Let's Encrypt sera temporairement déposé sur votre serveur web.
--webroot-path : nécessaire pour le challenge ACME, il s'agit du chemin absolu vers le répertoire contenant votre site (généralement /var/www/).
-- domains : le ou les noms de domaines qui seront couvert par le certificat (séparés par des virgules).
-- adree-tos : permet d'accepter automatiquement les conditions d'utilisation de l'autorité de certification.
--text : lancer la commande en mode texte et non en mode graphique.
--email : l'adresse mail qui sera nécessaire en cas de perte du compte.

Si la commande à réussi, vous avez désormais un certificat et la clé privée associée. Ils sont disponibles dans le répertoire ci-dessous :

sudo tree /etc/letsencrypt/live

cert.pem : le certificat.
privkey.pem : la clé privée.
chain.pem : le certificat intermédiaire.
fullchain.pem : le certificat racine et intermédiaire.

La prochaine étape consiste à paramétrer le serveur web pour utiliser le HTTPS, ainsi que le certificat et sa clé privée. Pour cela je vous recommande cet article sur ce même blog. Dans mes exemples j'utilise le serveur web NGINX, l'opération consiste à modifier le virtualhost, pour rediriger le traffic http vers https, et pour fournir le certificat et sa clé privée. Les paramètres supplémentaires ssl_protocols et ssl_ciphers, permettent de restreinte la liste des protocoles mis à disposition des visiteurs dans le but de s'appuyer sur les protocoles les plus fiables.

Ci-dessous un extrait de virtualhost pour NGINX, qui permet de rediriger les requêtes HTTP vers du HTTPS et qui utilise notre clé et son certificat Let's Encrypt. C'est la configuration minimale en terme de sécurité.

server {
  listen 80;
  server_name mon.site.fr;
  return 301 https://$server_name$request_uri;
}
server {
  listen 443 ssl;
  (...)

  ssl                               on;
  ssl_certificate             /etc/letsencrypt/live/mon.site.fr/cert.pem;
  ssl_certificate_key     /etc/letsencrypt/live/mon.site.fr/privkey.pem;
  ssl_protocols              TLSv1.2 TLSv1.1 TLSv1;
  ssl_ciphers                 ALL:!aNULL:!eNULL:!LOW:!EXP:!RC4:!3DES:+HIGH:+MEDIUM;
  ssl_prefer_server_ciphers   on;

  (...)
}

Ensuite il suffit de redémarrer son serveur web, pour prendre en compte ces modifications.

sudo systemctl restart nginx

L'autre force de Let's Encrypt et de Certbot c'est la possibilité de renouveler automatiquement le certificat. En effet, celui-ci après 90 jours arrivera à expiration et affichera un joli message d'alerte sur le navigateur. Pour éviter ça, nous allons créer un script qui sera lancé automatiquement une fois par mois, en utilisant Cron (plus d'info).

sudo vim /etc/cron.mounthly/certbot.sh

Ce script est très basique et ne fera que lancer certbot avec les mêmes paramètres que précédemment, mais en ajoutant --renew-by-default pour seulement renouveler le certificat.

#!/bin/bash
cd /home/pedro/git/certbot
./certbot-auto certonly --webroot --webroot-path /srv/web/p3ter.fr --domains p3ter.fr,www.p3ter.fr --agree-tos --text --email contact@p3ter.fr --renew-by-default

Ensuite il suffit de donner les droits d'exécution au script, pour que Cron puisse le lancer.

sudo chmod u+x /etc/cron.mounthly/certbot.sh

Savoir garder un secret

En guise de conclusion, je souhaite simplement attirer votre attention sur le fait que, comme dans la vrai vie, on ne confit pas un secret à n'importe qui. Dans le cadre du chiffrement c'est la même chose : votre clé privée doit rester un secret bien gardé. Par exemple, lorsqu'on utilise un service de mail hébergé par un tier, au hasard Google, c'est bien lui qui est propriétaire de la clé privée. Toute une conversation par mails chiffrée avec PGP peut tout à fait être lue par le tiers qui a fourni la clé de chiffrement.

Il existe en revanche des solutions décentralisées basées sur le protocole Tor, qui apportent une protection bien meilleur, dont j'espère vous parler prochainement sur ce blog.

Pour finir, j'aimerais vous recommander le blog de Aeris (membre de l'équipe de Cozy Cloud) et fin spécialiste du chiffrement. Vous y trouverez : un article sur les limites de Let's Encrypt, un article pour approfondir les systèmes de chiffrements et les comparer, et enfin un outil qui vous permettra de tester le niveau de sécurité d'un site web à partir de son URL. Du coté de Mozilla il existe Observatory un autre outil d'audit de la sécurité de votre site.


Un article à retrouver sur P3ter.fr

Vus : 867
Publié par P3ter : 34