232 lines
5.8 KiB
Markdown
232 lines
5.8 KiB
Markdown
# Howto EvoACME
|
|
|
|
## 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
|
|
|
|
# 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 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 /var/log/evoacme
|
|
# echo "acme: root" >> /etc/aliases && newaliases
|
|
~~~
|
|
|
|
Configuration pour evoacme :
|
|
|
|
~~~
|
|
# 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
|
|
encrypt_key = yes
|
|
distinguished_name = req_dn
|
|
prompt = no
|
|
[req_dn]
|
|
C = FR
|
|
ST = France
|
|
L = Marseille
|
|
O = Foo
|
|
OU = Security
|
|
emailAddress = security@example.com
|
|
~~~
|
|
|
|
### Configuration web pour le challenge http
|
|
|
|
Il faut ajouter un alias pour les challenge http du protocole ACME :
|
|
|
|
Pour Apache :
|
|
|
|
~~~
|
|
# 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>
|
|
|
|
# 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;
|
|
}
|
|
~~~
|
|
|
|
Inclure ensuite ce fichier dans le VHost par défaut :
|
|
|
|
~~~
|
|
server {
|
|
[…]
|
|
include /etc/nginx/snippets/letsencrypt.conf;
|
|
[…]
|
|
}
|
|
~~~
|
|
|
|
Vérifier et recharger la configuration de Nginx :
|
|
|
|
~~~
|
|
# 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 example 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
|
|
|
|
### Rewrite
|
|
|
|
Si vous avez une re-écriture http vers https, cela ne pose de problème (Let's Encrypt n'exige pas d'avoir un certificat valide pour sa vérification) MAIS il faut s'assurer de conserver l'URL.
|
|
|
|
Par exemple la ré-écriture suivante ne convient **pas** :
|
|
|
|
~~~
|
|
RewriteRule ^/(.*) https://example.com/ [L,R]
|
|
~~~
|
|
|
|
il faut avoir :
|
|
|
|
~~~
|
|
RewriteRule ^/(.*) https://example.com/$1 [L,R]
|
|
~~~
|
|
|
|
### Renommage des VirtualHosts
|
|
|
|
Attention, EvoACME s'appuie donc sur le nom du fichier de VirtualHost dans `/etc/apache2/sites-enabled/` ...attention en cas de renommage il faudra renommer également le .csr ! Notamment pour `000-default` si on le renomme en `zzz-default` par exemple.
|
|
|
|
### 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.
|