Relecture Let's Encrypt avant publication
This commit is contained in:
parent
58f73c640b
commit
3423550615
|
@ -6,45 +6,62 @@ title: Howto Let's Encrypt
|
||||||
* Documentation : <https://letsencrypt.org/docs/>
|
* Documentation : <https://letsencrypt.org/docs/>
|
||||||
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/revisions/unstable/show/evoacme>
|
* 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é
|
### 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é.
|
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_ :
|
||||||
Premièrement, il faut supprimer la tâche cron par défaut du paquet certbot qui est lance la commande certbot en root :
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
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
|
# mv /etc/cron.d/certbot /etc/cron.d/certbot.disabled
|
||||||
install -m 755 -o acme -g acme -d /etc/letsencrypt /var/log/letsencrypt /var/lib/letsencrypt
|
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
### Configuration du Serveur Web
|
### 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
|
#### Apache
|
||||||
|
|
||||||
Créer le fichier /etc/apache2/conf-available/letsencrypt.conf avec :
|
Configuration `/etc/apache2/conf-available/letsencrypt.conf` :
|
||||||
|
|
||||||
~~~
|
~~~{.apache}
|
||||||
SetEnvIf Request_URI "/.well-known/acme-challenge/*" no-jk
|
|
||||||
Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challenge
|
Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challenge
|
||||||
<Directory "/var/lib/letsencrypt/.well-known/acme-challenge">
|
<Directory "/var/lib/letsencrypt/.well-known/acme-challenge">
|
||||||
Options -Indexes
|
Options -Indexes
|
||||||
|
@ -53,17 +70,9 @@ Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challeng
|
||||||
</Directory>
|
</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
|
#### Nginx
|
||||||
|
|
||||||
Créer le fichier /etc/nginx/letsencrypt.conf :
|
Configuration `/etc/nginx/letsencrypt.conf` :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
location /.well-known/acme-challenge {
|
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
|
## 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.
|
||||||
|
|
Loading…
Reference in a new issue