Français‎ > ‎Pédagogie‎ > ‎

Let's encrypt

Let's encrypt est passé en beta publique récemment, ce qui veut dire que tout le monde peut désormais utiliser leur service pour obtenir des certificats reconnus par les navigateurs, et se débarasser des certificats auto-signés. Il y a pour le moment relativement peu de documentation sur Internet (et la plupart pas complètement newbies-friendly ?), donc j'ouvre ce post pour aider les gens souhaitant comprendre comment ça marche, et comment obtenir et utiliser les certificats - y compris avec les quelques spécificités de Yunohost.

Disclaimer : ce post est en construction continue et sera mis a jour au fur et à mesure que ma comprehension s'ameliore et que je reçois des commentaires. Je suis un noob moi-meme, donc n'hesitez pas a me corriger gentiment si je raconte n'importe quoi . Aussi : gardez à l'esprit que let's encrypt est toujours en beta, donc soyez patient si ce n'est pas parfait.

Un package expérimental disponible ici17 tente d'automatiser les instructions qui sont décrites ci-après.

0. Pourquoi est-ce que Let's encrypt est si bien ?

Pour comprendre la nouveauté apportée par Let's encrypt, il faut d'abord comprendre la problématique derrière les certificats HTTPS/SSL. Pour empecher un attaquant de générer des certificats pour des sites qu'il ne possède pas, les navigateurs web reposent sur des autorités de certifications (CA) auxquelles ils font « confiance ». Ces CA peuvent délivrer des certificats aux propriétaires de sites web, et ainsi le visiteur fait confiance au certificat fourni. Pour délivrer ces certificats, le CA doit évidemment vérifier que la personne à qui elle fourni le certificat possède bien le site/serveur/domaine.

C'est ce dernier point qui n'était pas facile à automatiser et requierait une intervention humaine, et était ce pour quoi il fallait payer pour obtenir un certificat. Let's Encrypt a créé une facon d'automatiser cela, grâce à un protocole (nommé ACME) entre une autorité de certification et un programme (le client) qui tourne sur votre serveur, qui permet donc de vérifier automatiquement que vous contrôlez un nom de domaine, et de délivrer le certificat correspondant (et aussi de le renouveler, etc..) - gratuitement. Dans ce post, nous utilisons le client ACME officiel de Let's encrypt (il existe d'autres clients).

Plus d'informations ici2, ici3 et ici7.

1. Installer le client Let's encrypt

Connectez vous en root sur votre serveur, puis :

# Assurez vous que votre systeme est a jour, ca ne devrais pas faire de mal
$ apt-get update
$ apt-get upgrade
# Allez dans votre home (en tant que root)
$ cd
# Clonez le dépôt git de Let's encrypt
$ git clone https://github.com/letsencrypt/letsencrypt
# Appelez letsencrypt-auto pour qu'il installe ses dépendances.
# (Ca peut prendre quelques minutes)
$ cd letsencrypt/
$ ./letsencrypt-auto --help

2. Editez la configuration de nginx et ssowat

Pour verifiez que vous êtes effectivement propriétaire de votreDomaine.tld, le client de Let's encrypt va ajouter des fichiers sur votre serveur et auxquels l'autorité de certification de Let's encrypt poura accéder.

Nous allons rendre l'URL votreDomaine.tld/.well-known/acme-challenge accessible, et le contenu correspondant sera stocké dans /tmp/letsencrypt-auto. Ajoutez un fichier de config nginx, par exemple nommé letsencrypt.conf, via nano /etc/nginx/conf.d/votreDomaine.tld.d/letsencrypt.conf. Dans ce fichier, ajoutez ce bloc :

location '/.well-known/acme-challenge' {
    default_type "text/plain";
    root         /tmp/letsencrypt-auto;
}

Dans le contexte de Yunohost, nous devons aussi modifier la configuration SSOwat pour que les serveurs de Let's encrypt ne soient pas redirigés vers l'interface de login en tentant d'accéder à .well-known/acme-challenge. Ouvrez le fichier de règles persistantes pour SSOwat (nano /etc/ssowat/conf.json.persistent), et ajoutez une nouvelle règle unprotected_urls :

{
    unprotected_urls : [
        "votreDomaine.tld/.well-known/acme-challenge"
    ]
}

Verifiez que votre configuration nginx est valide avec nginx -t puis redémarrez le daemon avec service nginx restart. (Pas besoin de faire quoi que ce soit pour SSOwat)

3. Obtenir les certificats

Maintenant nous allons effectivement demander le certificat à l'autorité de certification. Créez un fichier de configuration, par exemple /etc/letsencrypt/conf.ini, avec le contenu suivant :

#################################
#  Let's encrypt configuration  #
#################################

# Taille de la clef
rsa-key-size = 4096

# Email de notification / contact si necessaire dans le futur
email = some_admin_user@votreDomaine.tld

# Utiliser l'interface texte
text = True
# Accepter les Conditions d'Utilisation du service
agree-tos = True

# Utiliser la methode d'authentification webroot
# avec le contenu dans /tmp/letsencrypt-auto
authenticator = webroot
webroot-path = /tmp/letsencrypt-auto

# (Serveur de test uniquement : si vous l'utilisez,
# votre certificat ne sera pas vraiment valide)
# server = https://acme-staging.api.letsencrypt.org/directory

(N'oubliez pas de changer l'adresse email dans le fichier de configuration.) De retour à la ligne de commande, listons les domaines pour lesquels vous souhaitez un certificat :

# Si plusieurs, mettre -d domaine1.tld -d domaine2.tld ...
$ export DOMAINS="-d votreDomaine.tld"

Récupérons maintenant le certificat, en indiquant le fichier de config et les domaines dans les options :

$ cd ~/letsencrypt/
$ mkdir -p /tmp/letsencrypt-auto
$ ./letsencrypt-auto certonly --config /etc/letsencrypt/conf.ini $DOMAINS
  • Si vous voyez un messsage d'erreur comme Error: The client lacks sufficient authorization, cela signifie que les serveurs de Let's encrypt n'ont pas réussi a joindre l'url votreDomaine.tld/.well-known/acme-challenge. Vous devriez vérifier votre configuration nginx, les permissions de /tmp/letsencrypt-auto, et votre configuration SSOwat. Vous pouvez obtenir des indices en essayant d'accéder vous-même à l'URL, et en regardant les logs de nginx : tail -n 50 /etc/nginx/votreDomaine.tld-*.log.

  • Si vous voyez un Congratulations!, cela signifie que vos certificats devraient être disponibles dans /etc/letsencrypt/live/.

4. Utiliser vos certificats

Backupez vos certficats actuels :

$ mv /etc/yunohost/certs/votreDomaine.tld /root/backupCertificatsPourVotreDomainePointTLD

Maintenant, créez des liens symboliques vers vos nouveaux certificats :

$ mkdir /etc/yunohost/certs/votreDomaine.tld
$ cd    /etc/yunohost/certs/votreDomaine.tld
$ ln -s /etc/letsencrypt/live/votreDomaine.tld/fullchain.pem ./crt.pem
$ ln -s /etc/letsencrypt/live/votreDomaine.tld/privkey.pem   ./key.pem

Vérifiez que nginx est content avec nginx -t et redémarrez-le avec service nginx restart. Ensuite, ouvrez votre site dans votre navigateur et vous devriez normalement avoir un certificat signé par Let's encrypt et reconnu automatiquement ! (cliquez sur le cadenas à côté de l'URL pour voir les infos)

Si vous utilisez XMPP, il faut également donner les permissions à Metronome (le serveur XMPP) d'utiliser les certificats (merci tostaki pour l'info) :

$ chown root:metronome /etc/letsencrypt/archive/
$ chown root:metronome /etc/letsencrypt/live/
$ chmod g+rx           /etc/letsencrypt/archive/
$ chmod g+rx           /etc/letsencrypt/live/

et redémarrez Metronome :

$ service metronome restart

5. Renouveller automatiquement ses certificats

Pour encourager l'automatisation, les certificats de Let's encrypt ne sont valides que 90 jours et doivent être renouvelé après cette période. Dans le future, cette durée sera peut-être même plus courte.

Il est possible de mettre en place un cron job (tache automatique périodique) pour vérifier la validité de votre certificat et le renouveller si ils sont sur le point d'expirer. Il y a plusieurs méthodes et scripts disponibles sur les internets, voici ce que je propose :

# Recuperer le script
$ wget https://raw.githubusercontent.com/alexAubin/letsencrypt_ynh/131a7071faea0f1374faf04784024e7cab69703a/sources/certificateRenewer

# Ouvrez le script avec votre editeur favoris
# et verifiez que la configuration semble ok !
$ nano certificateRenewer
# En particulier :
# > remplacer DOMAIN_NAME dans EMAIL_ALERT_FROM
# > mettre votre adresse mail dans EMAIL_ALERT_TO
# > possiblement enlever le . dans LEBIN (.letsencrypt -> letsencrypt)

# Deplacez le scrupt dans les jobs hebdomadaires
$ chmod +x certificateRenewer
$ mv       certificateRenewer /etc/cron.weekly

# Si vous voulez, lancez le script manuellement (pour voir si il semble fonctionner)
$ /etc/cron.weekly/certificateRenewer

Problemes connus

  • Casse OpenVPN ? Voir ici

References / more stuff