diff --git a/HowtoLetsEncrypt.md b/HowtoLetsEncrypt.md index ba26ce72..ee1e63b6 100644 --- a/HowtoLetsEncrypt.md +++ b/HowtoLetsEncrypt.md @@ -6,45 +6,62 @@ title: Howto Let's Encrypt * Documentation : * Rôle Ansible : -Let's Encrypt est l'autorité de certification a l'origine du protocole ACME, elle permet l'obtention de certificat SSL gratuit de manière automatisé. +[Let's Encrypt](https://letsencrypt.org/) est une autorité de certification fournissant des certificats [SSL](HowtoSSL) valables 90 jours gratuitement et automatiquement. +L'obtention d'un certificat signé s'effectue via le protocole [ACME (Automated Certificate Management Environment)](https://en.wikipedia.org/wiki/Automated_Certificate_Management_Environment), +ce qui nécessite d'avoir temporairement un serveur HTTP sur le port TCP/80 de l'adresse IP correspondant au _Common Name_ du certificat à signer. +Le certificat intermédiaire de Let's Encrypt est également signés par l'autorité de certification _IdenTrust_ préinstallée dans la plupart des navigateurs. -Un client ACME est nécessaire pour communiquer avec les serveurs de Let's Encrypt et obtenir un certificat. Il en existe plusieurs. -## Client officiel (Certbot) +## Installation -[Certbot](https://certbot.eff.org/) est le client officiel de Let's Encrypt, il est disponible en paquet sous Debian à partir des backports de Jessie. +Un client ACME est nécessaire pour communiquer avec les serveurs de Let's Encrypt et obtenir un certificat. -Pour l'installer sous Jessie, il faut avoir activé les backports, puis : +Nous utilisons le client officiel [Certbot](https://certbot.eff.org/) disponible via les [backports](HowtoDebian/Backports). + +On ajoute les lignes suivantes à `/etc/apt/preferences.d/backports` : ~~~ -apt install certbot -t jessie-backports +Package: certbot python-certbot python-acme python-cryptography python-openssl python-setuptools python-ndg-httpsclient python-pyasn1 +Pin: release a=jessie-backports +Pin-Priority: 999 +~~~ + +puis on installe certbot et ses dépendances : + +~~~ +# apt install certbot + +$ certbot --version +certbot 0.9.3 ~~~ ### Création d'un utilisateur dédié -Afin de ne pas faire tourner certbot avec l'utilisateur root et de ne pas lui donner accès aux clés SSL, nous allons faire tourner certbot avec un utilisateur dédié. - -Premièrement, il faut supprimer la tâche cron par défaut du paquet certbot qui est lance la commande certbot en root : +On évite de faire tourner certbot avec l'utilisateur _root_ (notamment pour ne pas lui donner accès aux clés privées). +Nous allons créer un utilisateur dédié _acme_ : ~~~ -rm /etc/cron.d/certbot +# adduser --home /var/lib/letsencrypt --quiet --system --no-create-home --group acme +# install -m 755 -o acme -g acme -d /etc/letsencrypt /var/lib/letsencrypt +# install -m 750 -o acme -g acme -d /var/log/letsencrypt ~~~ -Ensuite on crée un utilisateur dédié à certbot (ici "acme") et on corrige les droits en conséquence : +et désactiver la tâche cron `/etc/cron.d/certbot` : ~~~ -useradd acme -d /etc/letsencrypt -install -m 755 -o acme -g acme -d /etc/letsencrypt /var/log/letsencrypt /var/lib/letsencrypt +# mv /etc/cron.d/certbot /etc/cron.d/certbot.disabled ~~~ ### Configuration du Serveur Web +Pour vérifier que la demande est légitime, Let's Encrypt doit accéder à un fichier temporaire via HTTP sur le port TCP/80 de l'adresse IP correspondant au _Common Name_ du certificat à signer, +du type *http://www.example.com/.well-known/acme-challenge/hNgN_ygEFf-XiHJd6VErwNbfRcpP2CbJmIN3qpJXZOQ* + #### Apache -Créer le fichier /etc/apache2/conf-available/letsencrypt.conf avec : +Configuration `/etc/apache2/conf-available/letsencrypt.conf` : -~~~ -SetEnvIf Request_URI "/.well-known/acme-challenge/*" no-jk +~~~{.apache} Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challenge Options -Indexes @@ -53,17 +70,9 @@ Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challeng ~~~ -Puis activer ce fichier : - -~~~ -ln -s /etc/apache2/conf-available/letsencrypt.conf /etc/apache2/conf-enabled/letsencrypt.conf -apache2ctl -t -service apache2 reload -~~~ - #### Nginx -Créer le fichier /etc/nginx/letsencrypt.conf : +Configuration `/etc/nginx/letsencrypt.conf` : ~~~ location /.well-known/acme-challenge { @@ -73,25 +82,54 @@ location /.well-known/acme-challenge { } ~~~ -Il faudra ensuite inclure ce fichier dans chaque vhost utilisant Let's Encrypt. -### Génération du certificat +## Génération du certificat -Générér une clé SSL dans /etc/ssl/private et un CSR (voir [HowtoSSL](http://wiki.evolix.org/HowtoSSL)) : +Générér une clé privée (www.example.com.key) et sa demande de certificat associé (www.example.com.csr) (voir [HowtoSSL]()) : ~~~ -openssl req -newkey rsa:2048 -sha256 -nodes -keyout /etc/ssl/private/ma-cle.ssl -out mon-csr.csr +# mkdir -p /etc/letsencrypt/www.example.com/ +# openssl req -newkey rsa:2048 -sha256 -nodes -keyout /etc/ssl/private/www.example.com.key -out /etc/letsencrypt/www.example.com/www.example.com.csr +# chown -R acme:acme /etc/letsencrypt/www.example.com/ ~~~ -Faire la demande de certificat (avec l'utilisateur acme, le csr doit être accessible en lecture à cet utilisateur) : +Faire la demande de certificat avec l'utilisateur _acme_ : ~~~ -sudo -u acme certbot certonly --webroot --csr mon-csr.csr --webroot-path /var/lib/letsencrypt -n --agree-tos --cert-path=/etc/letsencrypt/mon-cert.crt --fullchain-path=/etc/letsencrypt/mon-cert-fullchain.pem --chain-path=/etc/letsencrypt/mon-cert-chain.pem email@example.com +$ certbot certonly --webroot --csr /etc/letsencrypt/www.example.com/www.example.com.csr --webroot-path /var/lib/letsencrypt -n --agree-tos --register-unsafely-without-email ~~~ -Votre certificat est maintenant présent dans /etc/letsencrypt/mon-cert.crt ! +Votre certificat est maintenant présent dans `/etc/letsencrypt/live/www.example.com/`. + +> *Note* : l'utilisateur _acme_ n'a pas accès aux clés privées : + +~~~ +$ cat /etc/ssl/private/www.example.com.key +cat: /etc/ssl/private/www.example.com.key: Permission non accordée +~~~ + +## Renouvellement du certificat + +Les certificats Let's Encrypt sont valables 90 jours. Avant la date d'expiration, il faudra relancer avec l'utilisateur _acme_ : + +~~~ +$ certbot certonly --webroot --csr /etc/letsencrypt/www.example.com/www.example.com.csr --webroot-path /var/lib/letsencrypt -n --agree-tos --register-unsafely-without-email +~~~ + +Le dernier certificat sera dans `/etc/letsencrypt/live/www.example.com/` tandis que les anciens certificats seront dans `/etc/letsencrypt/archive`. + ## Automatisation -Pour simplifier l'installation et la configuration de Certbot ainsi que la génération de CSR et de certificat, Evolix a créé le projet [Evoacme](https://forge.evolix.org/projects/ansible-roles/repository/revisions/unstable/show/evoacme). +Pour automatiser l'installation de _Certbot_ et la génération de certificat, nous utilisons des scripts : [Evoacme](https://forge.evolix.org/projects/ansible-roles/repository/revisions/unstable/show/evoacme). + +## FAQ + +### Certificat Wildcard ou EV + +Let's Encrypt ne permet pas de générer un certificat Wildcard ou EV (Extended Validation). + +### Je n'ai pas de port TCP/80 accessible + +Let's Encrypt vérifie la légitimité de la demande en faisant une requête DNS sur l'enregistrement DNS correspondant au _Common Name_ du certificat à signer (si il n'y a pas d'enregistrement DNS propagé mondialement, c'est donc impossible d'utiliser Let's Encrypt) et effectue une requête HTTP vers le port TCP/80 de l'adresse IP : il faut donc obligatoirement avoir temporairement un service HTTP sur le port TCP/80... au moins temporairement.