Relecture Let's Encrypt avant publication

This commit is contained in:
Gregory Colpart 2017-02-06 10:40:58 +01:00
parent 58f73c640b
commit 3423550615

View file

@ -6,45 +6,62 @@ title: Howto Let's Encrypt
* Documentation : <https://letsencrypt.org/docs/>
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/revisions/unstable/show/evoacme>
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
<Directory "/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
</Directory>
~~~
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.