Automatiser la génération d'un certificat Let’s Encrypt avec Nginx et un utilisateur non root

linux, letsencrypt
Publié le 26/02/2017 | Jérémy Grèze

Le projet Let’s Encrypt a démocratisé l'utilisation de certificats SSL gratuits pour sécuriser les connexions de nos sites internet (HTTPS).

Je suis amené à publier du contenu ou des APIs et j'avais besoin de trouver un moyen d'automatiser la génération de certificats Let’s Encrypt sur un serveur Ubuntu qui utilise le serveur Nginx. Et, petite contrainte personnelle, je souhaitais utiliser un script que ne s'exécute pas avec l'utilisateur root.

Je détaille ici la solution que j'ai trouvée.

Tout d'abord, créer un user letsencrypt.

sudo adduser letsencrypt
sudo su - letsencrypt

Puis, j'ai installé le client acme.sh à la racine du dossier utilisateur (/home/letsencrypt/).

git clone https://github.com/Neilpang/acme.sh.git
cd ./acme.sh
./acme.sh --install

A la racine, j'ai créé un dossier webroot qui accueillera les fichiers pour prouver la possession du domaine.

cd ~
mkdir webroot

Il faut modifier la configuration de Nginx pour que ce dossier soit accessible via HTTP (et redémarrer Nginx).

# A rajouter dans le fichier de configuration Nginx
# Par exemple: /etc/nginx/sites-available/mon-domaine.fr 

server {
    #...
    location ^~ /.well-known/acme-challenge/ {
        alias /home/letsencrypt/webroot/.well-known/acme-challenge/;
    }
    #...
}

Puis, on peut lancer l'émission du certificat.

acme.sh --issue --log -d mon-domaine.fr -w ~/webroot

Une fois le certificat obtenu, une autre étape est nécessaire pour générer des certificats utilisables par Nginx, et les référencer dans la configuration Nginx.

mkdir -p certificates/mon-domaine.fr

acme.sh --installcert -d mon-domaine.fr \
--certpath /home/letsencrypt/certificates/mon-domaine.fr/cert \
--keypath /home/letsencrypt/certificates/mon-domaine.fr/key \
--fullchainpath /home/letsencrypt/certificates/mon-domaine.fr/fullchain \
--reloadcmd "sudo systemctl reload nginx.service"
# A rajouter dans le fichier de configuration Nginx
# Par exemple: /etc/nginx/sites-available/mon-domaine.fr

server {
    #...

    # SSL configuration
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl_certificate /home/letsencrypt/certificates/mon-domaine.fr/fullchain;
    ssl_certificate_key /home/letsencrypt/certificates/mon-domaine.fr/key;

    #...
}

Enfin, il faut autoriser l'utilisateur letsencrypt à redémarrer Nginx via la commande sudo. On édite les droits sudoers avec la commande visudo.

# User privilege specification
letsencrypt ALL= NOPASSWD: /bin/systemctl reload nginx.service

On vérifie que la tâche cron a bien été installée.

crontab -l

14 0 * * * "/home/letsencrypt/.acme.sh"/acme.sh --cron --home "/home/letsencrypt/.acme.sh" > /dev/null

Ressources utilisées: