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

  1. 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 fichier www.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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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
    
    
    
    Include /etc/apache2/include/acme-challenge.conf
    Include /etc/apache2/include/redirect-to-https.conf
    
    </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.key
    # Configuration spécifique au virtualhost
    
    </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