Mes passions, le boulots, mes coups de gueule...




Générer et installer des certificats HTTPS avec Let’s Encrypt

Categorie : Geek, Informatique, Linux, Raspberry Pi · par 18 Déc 2016

Introduction

Il y a deux ans, je m’étais penché sur la mise en place du chiffrement HTTPS avec les 2 articles suivants :

Dans le second article, je vous avais présenté StartSSL, une autorité de certification qui offrait un certificat de base gratuit.

Malheureusement, suite à une gestion calamiteuse de la distribution des certificats par la société tierce WoSign, les différents éditeurs de navigateurs ont décidé de retirer la confiance aux certificats émis par StartSSL.

Apple écrit dans son billet du 5 décembre 2016 :

L’autorité de certification WoSign a rencontré de multiples problèmes de contrôle dans ses processus d’émission de certificats pour la CA intermédiaire WoSign CA Free SSL Certificate G2. Même si aucune racine WoSign ne figure dans la liste des racines de confiance Apple, cette CA intermédiaire utilisait des relations de certificats signés de manière croisée avec StartCom et Comodo pour se faire approuver sur les produits Apple.

À la lumière de ces découvertes, nous avons pris des mesures pour protéger les utilisateurs dans une mise à jour de sécurité. Les produits Apple ne se fient plus à l’autorité de certification intermédiaire WoSign CA Free SSL Certificate G2.

Firefox écrit dans son billet du 24 octobre 2016 :

Mozilla a découvert qu’une autorité de certification appelée WoSign a rencontré un certain nombre d’échecs techniques et de gestion. Très sérieusement, nous avons découvert qu’ils anti-dataient les certificats SSL afin de contourner la date limite du 1er janvier 2016 à laquelle les CA devront cesser de délivrer des certificats SSL SHA-1. En outre, Mozilla a découvert que WoSign avait acquis la pleine propriété d’un autre CA appelé StartCom sans le signaler, comme l’exige la politique de Mozilla. Les représentants de WoSign et de StartCom ont nié et continué de réfuter ces deux allégations jusqu’à ce que des données suffisantes aient été recueillies pour démontrer que les deux allégations étaient correctes. La malhonnêteté affichée par les représentants de cette entreprise a conduit Mozilla à se méfier des futurs certificats chaînés jusqu’à l’actuel WoSign inclus et les certificats racines StartCom.

  1. Mozilla et Google ont décidé de se méfier de tous les certificats racines StartCom à partir du 21 octobre, cette situation aura un impact dans la prochaine version de Firefox et Chrome en janvier. La décision d’Apple annoncée le 30 novembre de se méfier de tous les certificats racines StartCom à compter du 1er décembre aura un impact dans leur prochaine mise à jour de sécurité.
  2. Les abonnés qui ont payé les frais de validation après le 21 octobre peuvent obtenir un remboursement complet sur demande.
  3. StartCom fournira bientôt une solution provisoire et remplacera tous les certificats émis le ou après le 21 octobre en cas de demande. Entre-temps, StartCom met à jour tous les systèmes et génèrera de nouveaux CA racines comme demandé par Mozilla pour regagner la confiance dans ces navigateurs.

Concrètement, les versions de Firefox et Chrome qui sortiront à partir janvier n’accepteront plus les certificats signés après les 21 octobre.

Chez Apple, les nouvelles versions de Safari n’accepteront plus de se connecter aux sites dont le certificat a été signé après le 30 novembre 2016.
C’est déjà le cas de Safari inclus dans iOS 10.2.

 

Let’s Encrypt, l’alernative gratuite et open-source

Let’s Encrypt est une autorité de certification propulsée par l’Internet Security Research Group (ISRG) qui vise à augmenter significativement la part de trafic HTTPS sur les sites web.

Elle est soutenue par des ténors d’internet comme : l’Electronic Frontier Foundation (EFF), la Fondation Mozilla, Akamai, Cisco Systems, PlanetHoster, OVH, …

Je vous laisse lire la page Wikipedia du projet pour comprendre son fonctionnement.

Installation de Let’s Encrypt

Cloner le repo GitHub

Nous allons nous placer dans le dossier /home/pi :

$ cd /home/pi

Puis, nous allons cloner le repo GitHub :

$ git clone https://github.com/letsencrypt/letsencrypt

On se place dans le dossier nouvellement créé :

$ cd letsencrypt

Un petit ls nous retourne ceci :

Le script python qui nous intéresse est certbot-auto.

La commande ./certbot-auto --help nous retourne l’aide toujours utile à avoir sous la main.

Générer les certificats

On va commence par arrêter le serveur web Nginx pour permettre le mode standalone :

$ sudo service nginx stop

Puis on va exécuter le script :

$ ./certbot-auto certonly --standalone --rsa-key-size 4096

certonly permet d’obtenir un certificat, mais de ne pas l’installer automatiquement.

--standalone va exécuter un petit serveur Web autonome pour l’authentification. Ceci nous évitera d’installer un plugin à Nginx.

--rsa-key-size 4096 va générer un certificat avec une clef RSA de 4096 bits. La valeur par défaut est de 2048.

NB.: La première exécution du script peut prendre plusieurs minutes car celui-ci va installer tous les composants python nécessaires à son fonctionnement.

L’adresse email sera utilisée pour avertir l’utilisateur de l’imminence de la fin de validité d’un certificat.

Les certificats générés seront placés dans le dossier : /etc/letsencrypt/live/www.domaine.tld/

On retiendra ces deux ci : fullchain.pem et privkey.pem

Configurer Nginx

Voici un exemple de configuration Nginx :

server {

    listen   80;                 ## listen for ipv4; this line is default and implied
    default_server;

    # Accès uniquement depuis www.domaine.tld
    server_name www.domaine.tld;

    # Force le HTTPS depuis un appel en HTTP
    return        301 https://$server_name$request_uri;

}

server {

    listen 443     default_server;

    server_name www.domaine.tld;

    root /var/www/;

    index index.php index.html index.htm;

    # Turn on SSL and SSL specific settings.
    ssl on;
 
    # SSL certificate and key location.
    ssl_certificate /etc/letsencrypt/live/www.domaine.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.domaine.tld/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;

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

    #ssl_session_tickets off; # Requires nginx >= 1.5.9
    #ssl_stapling on; # Requires nginx >= 1.3.7
    #ssl_stapling_verify on; # Requires nginx => 1.3.7

    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

}

Une fois la configuration d’Nginx terminée, on le relance :

$ sudo service nginx start

Renouveler les certificats

$ sudo service nginx stop
$ ./certbot-auto renew
$ sudo service nginx start

Références :

https://mondedie.fr/
https://en.sutublog.com/

Laisser un commentaire