TerminalPour beaucoup d’entre nous, Let’s Encrypt a révolutionné l’hébergement de sites sécurisés depuis la sortie de sa première version bêta fin 2015. Mon précédent article sur Certbot et Let’s Encrypt fournit un petit script shell très rudimentaire à la fin pour faciliter la génération et le renouvellement automatique des certificats.

Voici une mouture plus évoluée de ce script, nommée letsencrypt.sh. Si vous gérez un certain nombre d’hébergements sécurisés sur un seul serveur dédié, ce script vous facilitera la vie.

Pour expliquer le fonctionnement du script, je vais tout simplement le montrer en action sur une des machines que je gère. Pour commencer, je récupère le script depuis mon dépôt Gitlab.

$ git clone https://gitlab.com/kikinovak/centos.git

Le répertoire el7/certbot contient le script letsencrypt.sh et un fichier README.

$ ls centos/el7/certbot/
letsencrypt.sh README.md

Je copie le script vers un endroit approprié.

$ cp centos/el7/certbot/letsencrypt.sh ~/bin/

Je me place dans le répertoire ~/bin et je définis les permissions qui vont bien.

$ cd ~/bin
$ chmod 0700 letsencrypt.sh

J’ouvre le script et j’édite d’abord quelques variables pour les adapter à ma configuration, en l’occurrence EMAIL et WEBROOT.

# Edit these variables according to your local configuration.
EMAIL='info@microlinux.fr'
CERTBOT='/usr/bin/certbot'
CERTGROUP='certs'
CERTGROUP_GID='240'
WEBSERVER='Apache'
WEBSERVER_DAEMON='httpd'
WEBROOT='/var/www'

Ensuite, j’édite la liste des domaines hébergés (DOMAIN[x]) et des répertoires correspondants par rapport à la racine du serveur web (WEBDIR[x]).

# Edit hosted domains and their corresponding directories under the web root.
DOMAIN[1]='sd-131691.dedibox.fr'
WEBDIR[1]='default'

DOMAIN[2]='bsco.io'
WEBDIR[2]='bsco-redirect'

DOMAIN[3]='www.bsco.io'
WEBDIR[3]='bsco-redirect'

DOMAIN[4]='accounting.bsco.io'
WEBDIR[4]='bsco-dolibarr'

DOMAIN[5]='cloud.bsco.io'
WEBDIR[5]='bsco-owncloud'

DOMAIN[6]='contact.bsco.io'
WEBDIR[6]='bsco-contact'

DOMAIN[7]='crypt.bsco.io'
WEBDIR[7]='bsco-crypt'

DOMAIN[8]='secrets-of-learning.com'
WEBDIR[8]='secrets-redirect'

DOMAIN[9]='www.secrets-of-learning.com'
WEBDIR[9]='secrets-redirect'

DOMAIN[9]='fr.secrets-of-learning.com'
WEBDIR[9]='secrets-fr-wordpress'

DOMAIN[10]='poc.secrets-of-learning.com'
WEBDIR[10]='secrets-poc-wordpress'

DOMAIN[11]='mail.secrets-of-learning.com'
WEBDIR[11]='secrets-roundcube'

Le script est censé être exécuté avec les droits d’administrateur.

$ ./letsencrypt.sh
Please run with sudo or as root.

Invoqué sans autre option, il affiche une aide succincte.

$ sudo ./letsencrypt.sh 
Usage: ./letsencrypt.sh OPTION
Create or renew an SSL/TLS certificate.
Options:
  -h, --help    Show this message.
  -t, --test    Perform a dry run.
  -c, --cert    Create/renew a certificate.

L’option --test me permet de tester la génération (ou le renouvellement) du certificat.

$ sudo ./letsencrypt.sh --test
Performing a dry run.
Stopping the Apache web server.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for accounting.bsco.io
http-01 challenge for bsco.io
http-01 challenge for cloud.bsco.io
http-01 challenge for contact.bsco.io
http-01 challenge for crypt.bsco.io
http-01 challenge for fr.secrets-of-learning.com
http-01 challenge for mail.secrets-of-learning.com
http-01 challenge for poc.secrets-of-learning.com
http-01 challenge for sd-131691.dedibox.fr
http-01 challenge for secrets-of-learning.com
http-01 challenge for www.bsco.io
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- The dry run was successful.

À partir de là, il ne me reste plus qu’à invoquer le script avec l’option --cert.

$ sudo ./letsencrypt.sh --cert
Stopping the Apache web server.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for accounting.bsco.io
http-01 challenge for bsco.io
http-01 challenge for cloud.bsco.io
http-01 challenge for contact.bsco.io
http-01 challenge for crypt.bsco.io
http-01 challenge for fr.secrets-of-learning.com
http-01 challenge for mail.secrets-of-learning.com
http-01 challenge for poc.secrets-of-learning.com
http-01 challenge for sd-131691.dedibox.fr
http-01 challenge for secrets-of-learning.com
http-01 challenge for www.bsco.io
Waiting for verification...
Cleaning up challenges
...
Starting the Apache web server.

Pour le renouvellement automatique des certificats tous les débuts de mois, il suffit d’ajouter une ligne correspondante dans les tâches automatiques du système.

$ sudo crontab -l
# Renew SSL certificate every first day of the month at 0:00
00 00 1 * * /home/microlinux/bin/letsencrypt.sh --cert

Voici le listing complet du script. Si vous avez des suggestions pour l’améliorer, n’hésitez pas à laisser un commentaire.


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

 


2 commentaires

remy · 16 avril 2020 à 15 h 30 min

Bonjour,

Les grands esprits se rencontrent (ou plutôt les mêmes besoins 😉 )
J’ai un script similaire ici : https://gist.github.com/remyd1/35fdbcb740fa4fdec1a15727ad7e743c

Il s’appelle aussi letsencrypt.sh. Voici comment je l’utilise (1ère partie de l’article) :
https://cbi.mbb.cnrs.fr/remydernat/https_mgmt.html

Je pense qu’il y aurait sûrement moyen de fusionner les 2 scripts pour les améliorer.

a+
Rémy.

    kikinovak · 16 avril 2020 à 15 h 57 min

    Effectivement. Mais ton script a l’air plus élaboré et un peu mieux fichu. Le mien est somme toute assez rudimentaire… mais fait très bien l’affaire. Comme quoi différents chemins mènent à Saint-Bauzille-de-Putois. :o)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *