Un certificat Let's Encrypt pour votre Cozy

Cadenas_Vert

Le temps des certificats auto-signés (avec les maudites alertes qui vont avec) sont maintenant derrière nous grâce à Let’s Encrypt, une autorité de certification gratuite.

Untrusted_Connection

Depuis le 3 décembre 2015, tout le monde peut participer à la phase de test du projet et obtenir des certificats. Dans cet article, nous allons expliquer la marche à suivre pour obtenir et installer un tel certificat.

Les pré-requis sont :

  • posséder un nom de domaine ;
  • héberger soi-même son Cozy ;
  • une addresse email (ça n’est pas obligatoire mais hautement recommandé : Let’s Encrypt utilisera cette adresse pour signaler des problèmes de sécurité et vous prévenir quelques jours avant que votre certificat expire).

Installation de Let’s Encrypt

Toutes les commandes suivantes doivent être exécutées avec les droits root. Faite-les donc précéder de sudo, ou, plus simplement, lancez un shell avec ces droits :

sudo su

Assurez vous que les paquets git et ca-certificates sont installés :

apt-get install git ca-certificates

Installez Let’s Encrypt depuis son dépôt Github :

git clone https://github.com/certbot/certbot /root/letsencrypt

NB : L’ancien repo https://github.com/letsencrypt/letsencrypt est devenu obsolète

Configuration de Let’s Encrypt et génération de votre premier certificat

Dans cet exemple, nous allons utiliser l’adresse myaddress@example.com pour obtenir un certificat pour un serveur Cozy sur le domaine https://mycozy.domain.com.

Tout d’abord, il faut accepter les conditions générales Let’s encrypt : ici

Pour vérifier que vous êtes bien le propriétaire du domaine pour lequel nous demandez un certificat, le serveur de Let’s encrypt a besoin de communiquer avec votre serveur Web. Vous pouvez soit gérer cela avec votre propre serveur Web, en rendant accessibles des fichiers fournis par Let’s encrypt à une URL déterminée, soit arrêter temporairement votre serveur Web et lancer un serveur spécifique à Let’s Encrypt, qui s’occupera de la validation du domaine et de la génération des certificats. C’est cette seconde option que nous avons choisie.

Nous commençons donc par arrêter le serveur Nginx, ce qui va rendre votre Cozy inaccessible pour quelques minutes :

/etc/init.d/nginx stop

Sauvegarder votre ancien certificat et sa clé :

mv /etc/cozy/server.key /etc/cozy/server.key.backup
mv /etc/cozy/server.crt /etc/cozy/server.crt.backup

La commande suivante va créer un compte sur les serveurs de Let’s Encrypt et générer votre premier certificat. Adaptez la avec votre adresse email et le nom de domaine de votre Cozy :

/root/letsencrypt/letsencrypt-auto certonly \
   --standalone --agree-tos \
   --email myaddress@example.com -d mycozy.domain.com \
   --standalone-supported-challenges tls-sni-01

Installez ensuite le nouveau certificat, généré dans le dossier /etc/letsencrypt/live/mycozy.domain.com/ (attention, le chemin des fichiers dépend de votre domaine) :

ln -s /etc/letsencrypt/live/mycozy.domain.com/privkey.pem /etc/cozy/server.key
ln -s /etc/letsencrypt/live/mycozy.domain.com/fullchain.pem /etc/cozy/server.crt

Il ne reste plus qu’à redémarrer Nginx :

/etc/init.d/nginx start

Vous pouvez à présent vous connecter à votre Cozy et vérifier, en cliquant sur le cadenas situé à la gauche de l’URL, que la communication est sécurisée grâce au nouveau certificat.

Mettre en place un renouvellement automatique tous les mois

Les certificats Let’s Encrypt ne sont valide que 90 jours. Il faut donc les renouveler régulièrement. Nous allons automatiser ce renouvellement en créant une tâche périodique qui générera de nouveaux certificats le 1er de chaque mois.

Créez un fichier /root/renew_cert.sh contenant le script suivant :

#!/bin/sh
/etc/init.d/nginx stop
/root/letsencrypt/letsencrypt-auto certonly --standalone -d mycozy.domain.com --standalone-supported-challenges tls-sni-01 --renew-by-default
/etc/init.d/nginx start

(en replaçant mycozy.domain.com par l’adresse de votre Cozy)

Rendez ce script executable

chmod u+x /root/renew_cert.sh

Vous pouvez testez ce script en l’exécutant manuellement (attention, des quotas sont en place : vous ne pouvez générer que 5 certificats par semaine pour un même domaine).

Il nous reste à lancer le script automatiquement tous les mois.

Ouvrez votre crontab :

crontab -e

Ajoutez la ligne suivante à la fin du fichier, puis enregistrez-le

0 3 1 * * /root/renew_cert.sh

Voilà, votre certificat sera désormais automatiquement renouvelé le 1er de chaque mois à 3h du matin. Profitez du bonheur de ne plus ajouter ces exceptions.

Pour aller plus loin

Pour trouver plus d’informations sur Let’s Encrypt, nous conseillons leur site et leur forum.

Pour avoir plus d’informations sur le client officiel, allez voir la documentation et les sources sur github.

En cas de souci, n’hésitez pas à venir poster sur notre forum.

Photo by Nicki Mannix used under CC-BY 2.0