Intoduction
Chaque machine a sa propre clé privée, qu'elle utilise pour les mails, pour le web, le VPN, etc. En cas de compromission d'une machine, il n'y a ainsi pas besoin de changer toutes les clés et révoquer tous les certificats.
Let's encrypt
Remarques/Questions en suspens :
est-ce que l'on renouvelle automatiquement les certificats ? N'y a-t-il pas des services ou c'est problématique (genre le mail) ?
on ne peut pas faire de reload sur outils. Ça met apache en vrac à cause de sympa/fast-cgi. Il faut faire un stop et un start.
Choses à faire :
- l'utilisateur acme doit avoir le droit de redemarer les services concernés.
- creer un repertoire /etc/acme/auto avec des liens symboliques sur les fichiers de conf, comme pour xen.
- par défaut ne pas redémmarer/recharger les services dans acme_renew et rajouter une option pour ça, genre --handle-services
Nous utilisons désormais Let's encrypt pour nos certificats, et plus spécifiquenent le client acme tiny.py, disponible sur github, dont la documentation est ?README.md.
Les certificats Let's encrypt ont besoin d'être renouvelés au minimum tous les 90 jours.
Le script de renouvellement tourne chaque jour et vérifie que les certificats expire dans plus de 45 jours. Si ce n'est pas le cas les certificats concernés sont renouvelés. Ce script est exécuté par l'utilisateur acme qui doit avoir le droit de lire les clés privés et d'écrire le certificat.
Installation d'un nouveau certificat
configuration
L'idée est de mettre dans le repertoire
/etc/acme
, un fichier décrivant les chemins des certificats et clés associées. Exemple du fichierwww.grenode.net.conf
:DOMAINS="www.grenode.net grenode.net" _UNAME="www.grenode.net" _DIR="/etc/apache2/grenode.net" KEY="$_DIR/$_UNAME.key" CRT="$_DIR/$_UNAME.crt" CSR="$_DIR/$_UNAME.csr" CHAINED="$_DIR/$_UNAME.chained" INTERMEDIATE="$_DIR/$_UNAME.intermediate" ACME_KEY="$_DIR/$_UNAME.acme.key" ACME_CHALLENGE_ROOT=~acme/challenges ACME_CHALLENGE_URL=/.well-known/acme-challenge ACME_CHALLENGE_DIR="${ACME_CHALLENGE_ROOT}/${ACME_CHALLENGE_URL}" RESTART_SERVICE=apache2
Création des clés et demande de certification
Cf script acme create
sudo /usr/local/bin/acme_create --config /etc/acme/www.grenode.conf
Configuration du serveur web pour acme
Il est nécessaire de faire en sorte que le serveur web réponde sur l'url
/.well-known/acme-challenge
pour tous les domaine concernés et renvoie vers$ACME_CHALLENGE_ROOT/.well-known/acme-challenge
. Pour simplifier, tous les virtualhosts utilisent le même répertoire pour stocker les challenges,/var/lib/acme/challenges/
.Configuration pour apache 2.4 :
Alias /.well-known/acme-challenge /var/lib/acme/challenges/.well-known/acme-challenge <Directory /var/lib/acme/challenges> Require all granted </Directory>
Pour éviter de se répéter, cette configuration est partagée :
Include /etc/apache2/include/acme-challenge.conf
Génération des certificats
Ensuite pour créer le certificat nous utilisons le même script que pour le renouveler (script acme renew). Il exécute en gros les actions suivantes :
sudo -u acme /usr/local/bin/acme_renew --config /etc/acme/www.grenode.conf
Configuration du serveur web pour ce certificat
Un fichier de configuration est fourni pour rediriger vers HTTPS, en laissant l'accès aux challenges Let's Encrypt en HTTP :
Include /etc/apache2/include/redirect-to-https.conf
La configuration d'un virtualhost typique ressemble à ça :
<VirtualHost *:80> ServerName foo.grenode.net
</VirtualHost> <VirtualHost *:443> ServerName foo.grenode.net SSLEngine on SSLCertificateFile /etc/apache2/sites/foo.grenode.net/foo.grenode.net.chained SSLCertificateKeyFile /etc/apache2/sites/foo.grenode.net/foo.grenode.net.keyInclude /etc/apache2/include/acme-challenge.conf Include /etc/apache2/include/redirect-to-https.conf
</VirtualHost># Configuration spécifique au virtualhost
Mise en place initiale
sudo adduser --home /var/lib/acme --gecos acme --disabled-password acme
sudo mkdir /etc/acme
Copie des scripts acme_create
, acme_renew
et acme_tiny/acme_tiny.py
dans
/usr/local/bin
.
Rajout de la possibilité pour acme de recharger les services concernés sans mots de passe :
sudo tee /etc/sudoerd.d/acme <<EOF
acme ALL=(root) NOPASSWD: /usr/sbin/service apache2 restart
acme ALL=(root) NOPASSWD: /usr/sbin/service apache2 reload
EOF
Rajout de la crontab
sudo -u acme crontab - <<EOF
MAILTO=root@grenode.net
0 4 * * * /usr/local/bin/acme_renew --all
EOF
Autres certificats
Machine | Utilisation | Date installation | Empreinte SHA1 | Commentaire |
---|---|---|---|---|
outils | postfix, apache | 19 avril 2014 | 6B:58:32:CF:28:B8:72:47:38:87:82:0B:FE:2C:20:7C:9C:F0:28:7D |
|
gaffe | postfix, apache | 20 avril 2014 | 22:BA:CC:B3:99:06:F6:34:C9:B5:D8:B4:7D:05:EA:1E:2F:5E:83:E4 |
Pour obtenir la fingerprint à partir du certificat :
openssl x509 -in grenode-outils-cert-20160418.pem -fingerprint