Browse Source

Amélioration de HowtoEvoACME

master
Jérémy Lecour 3 years ago
committed by Jérémy Lecour
parent
commit
70fba1c7e7
1 changed files with 161 additions and 35 deletions
  1. +161
    -35
      HowtoEvoACME.md

+ 161
- 35
HowtoEvoACME.md View File

@ -2,34 +2,83 @@
## Installation
### certbot
EvoAcme utilise Certbot, le client Let's Encrypt créé par l'EFF.
Pour Debian Stretch, il suffit d'installer le paquet.
~~~
# apt install certbot
~~~
Pour Debian Jessie, il faut l'installer à partir des backports.
~~~
# cat /etc/apt/sources.list.d/backports.list
deb http://mirror.evolix.org/debian jessie-backports main
# tail -4 /etc/apt/preferences.d/backports
# cat /etc/apt/preferences.d/z-backports-certbot
Package: certbot python-certbot python-acme python-cryptography python-openssl python-setuptools python-ndg-httpsclient python-pyasn1 python-pkg-resources
Pin: release a=jessie-backports
Pin-Priority: 999
# apt install certbot
# apt update && apt install certbot
~~~
Certbot installe son propre script dans la crontab, mais nous allons le remplacer
~~~
# mv /etc/cron.d/certbot /etc/cron.d/certbot.disabled
~~~
### evoacme
Nous créons un utilisateur `acme` à qui nous attribuons les dossiers :
~~~
# 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
# install -m 750 -o acme -g acme -d /var/log/evoacme
# mv /etc/cron.d/certbot /etc/cron.d/certbot.disabled
# install -m 750 -o acme -g acme -d /var/log/letsencrypt /var/log/evoacme
# echo "acme: root" >> /etc/aliases && newaliases
~~~
# cat /etc/apache2/conf-available/letsencrypt.conf
Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challenge
<Directory "/var/lib/letsencrypt/.well-known/acme-challenge">
Options -Indexes
Allow from all
Require all granted
</Directory>
Configuration pour evoacme :
# a2enconf letsencrypt
# systemctl reload apache2
~~~
# cat /etc/default/evoacme
SSL_KEY_DIR=/etc/ssl/private
ACME_DIR=/var/lib/letsencrypt
CSR_DIR=/etc/ssl/requests
CRT_DIR=/etc/letsencrypt
LOG_DIR=/var/log/evoacme
SSL_MINDAY=30
EMAIL=security@example.com
~~~
Tâche quotidienne :
~~~{.bash}
# cat /etc/cron.daily/evoacme
#!/bin/sh
#
# Run evoacme script on every configured cert
#
# Author: Victor Laborie <vlaborie@evolix.fr>
# Licence: AGPLv3
#
[ -f /etc/default/evoacme ] && . /etc/default/evoacme
CRT_DIR="${CRT_DIR:-'/etc/letsencrypt'}"
export QUIET=1
find "${CRT_DIR}" -maxdepth 1 -mindepth 1 -type d ! -path "*accounts" ! -path "*hooks" -printf "%f\n" | xargs -n1 evoacme
~~~
### Configuration OpenSSL
~~~
# cat /etc/letsencrypt/openssl.cnf
[req]
default_bits = 2048
@ -43,40 +92,117 @@ L = Marseille
O = Foo
OU = Security
emailAddress = security@example.com
~~~
# cat /etc/default/evoacme
SSL_KEY_DIR=/etc/ssl/private
ACME_DIR=/var/lib/letsencrypt
CSR_DIR=/etc/ssl/requests
CRT_DIR=/etc/letsencrypt
LOG_DIR=/var/log/evoacme
SSL_MINDAY=15
### Configuration web pour le challenge http
# cat /etc/cron.daily/certbot
#!/bin/bash
Il faut ajouter un alias pour les challenge http du protocole ACME :
Pour Apache :
ls /etc/letsencrypt/*.crt 2>/dev/null |sed 's/.crt//'|while read vhost;
do
evoacme $(basename $vhost)>/dev/null
done
~~~
# cat /etc/apache2/conf-available/letsencrypt.conf
Alias /.well-known/acme-challenge /var/lib/letsencrypt/.well-known/acme-challenge
<Directory "/var/lib/letsencrypt/.well-known/acme-challenge">
Options -Indexes
Allow from all
Require all granted
</Directory>
Installer /usr/local/bin/make-csr et /usr/local/bin/evoacme
# a2enconf letsencrypt
# systemctl reload apache2
~~~
Pour Nginx :
~~~
# cat /etc/nginx/snippets/letsencrypt.conf
location ~ /.well-known/acme-challenge {
alias /var/lib/letsencrypt/;
try_files $uri =404;
allow all;
}
~~~
Générer un certificat pour un VirtualHost, par exemple `/etc/apache2/sites-enabled/foo.conf` :
Inclure ensuite ce fichier dans le VHost par défaut :
~~~
# make-csr foo
# evoacme foo
server {
[…]
include /etc/nginx/snippets/letsencrypt.conf;
[…]
}
~~~
puis configurer le VirtualHost avec :
Vérifier et recharger la configuration de Nginx :
~~~
SSLCertificateKeyFile /etc/ssl/private/foo.key
SSLCertificateFile /etc/letsencrypt/foo-fullchain.pem
# nginx -t
# systemctl reload nginx
~~~
## Scripts
Il y a 3 scripts à installer dans `/usr/local/sbin` :
* `vhosts-domains`
* `make-csr`
* `evoacme`
## Exécution
Sur un serveur web typique il y a 3 étapes.
### Déterminer la liste des domaines
`vhosts-domains example` permet d'extraire du VHost `example` la liste des domaines utilisés.
Il cherche les fichiers `/etc/apache2/sites-enabled/example.conf`, `/etc/nginx/sites-enabled/example.conf` et `/etc/nginx/sites-enabled/example` et utilise le premier trouvé.
~~~
# vhosts-domains example
www.example.com
example.com
~~~
### Créer un CSR
À partir de la liste des domaines du VHost, on crée un CSR :
~~~
# make-csr foo www.example.com example.com
~~~
Le CSR sera alors créé dans `/etc/ssl/requests/example.csr`
### Créer un certificat
~~~
# TEST=1 VERBOSE=1 evoacme example
~~~
Il va chercher un CSR à l'emplacement convenu : `/etc/ssl/requests/example.csr` et se connecter à Let's Encrypt pour créer un certificat.
La variable d'environnement `TEST=1` permet de générer un certificat non valide mais sans décompter le quota d'utilisation de Let's Encrypt. En effet les actions sont limitées et pendant les tests de mise en place il vaut mieux ne utiliser l'API de production. À enlever bien sûr pour générer le certificat final.
La variable `VERBOSE=1` permet d'afficher de nombreux messages utiles pour comprendre ce qui se passe, surtout en cas d'erreur.
Le certificat sera généré dans le dossier ` /etc/letsencrypt/example/<TIMESTAMP>/` et un fichier de configuration est généré (ou mis à jour) dans `/etc/nginx/ssl/example.conf` (pour Nginx) :
~~~
# cat /etc/nginx/ssl/example.conf
ssl_certificate /etc/letsencrypt/example/live/fullchain.pem;
ssl_certificate_key /etc/ssl/private/example.key;
~~~
Il faut s'assurer que le fichier `/etc/nginx/ssl/example.conf` est bien inclus dans le fichier du VHost afin que le bon certificat soit utilisé.
~~~
server {
[…]
include /etc/nginx/ssl/example.conf;
[…]
}
~~~
## FAQ
@ -102,4 +228,4 @@ Attention, EvoACME s'appuie donc sur le nom du fichier de VirtualHost dans `/etc
### Nom des fichiers dans /etc/ssl/private
Attention, EvoACME va créer une clé privée dans /etc/ssl/private en fonction du nom du VirtualHost : il faut s'assurer que cela ne va pas écraser une clé existante.
Attention, EvoACME va créer une clé privée dans /etc/ssl/private en fonction du nom du VirtualHost : il faut s'assurer que cela ne va pas écraser une clé existante.

Loading…
Cancel
Save