[Linux] – Certificat SSL Let’s Encrypt avec getssl

getssl est un script bash permettant d’obtenir gratuitement un certificat SSL de l’autorité de certification Let’s Encrypt, valide pour une durée de 3 mois.

Il prend en charge le renouvellement des certificats et contrairement à d’autres scripts tels que certbot, il ne nécessite aucune dépendance pour s’installer et fonctionner.

Lien vers le projet github : https://github.com/srvrco/getssl

 

Pré-requis

  • Un nom de domaine avec un enregistrement DNS pointant vers le serveur web
  • Un serveur web avec au moins un vhost 80 configuré
  • Un répertoire accessible à l’écriture et la lecture d’un token par getssl

Pour ce dernier point, voici comment ça se goupille : 

Créer un sous-réperstoire dans /var/www/www.mondomaine.com (généralement c’est ici qu’est installé votre site web, sinon adaptez) :

mkdir -p /var/www/www.mondomaine.com/.well-known/acme-challenge/

C’est dans ce répertoire que getssl fera ses vérifications pour valider que vous avez la main sur le nom de domaine et donc le site que vous souhaitez passer en https. Vous pouvez choisir un nom de répertoire et un emplacement différent que .well-known/acme-challenge/ à condition qu’apache ou nginx puisse diffuser son contenu.

Mettre en place les bons droits sur les sous-répertoires créés :

chown -R www-data:www-data /var/www/www.mondomaine.com/.well-known/
chmod -R 750 /var/www/www.mondomaine.com/.well-known/

En principe si vous avez déjà un vhost dont la racine est /var/www/www.mondomaine.com/, il devrait pouvoir diffuser le contenu des sous-répertoires .well-known/acme-challenge/.

Tester l’accès dans un navigateur : http://www.mondomaine.com/.well-known/acme-challenge/ devrait renvoyer une page blanche mais pas d’erreur 404 ou 500 ou autre.

Installation et configuration de getssl

Récupérer le script getssl dans un répertoire qui va bien : 

cd /root/scripts/
curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl ; chmod 700 getssl

Générer le fichier conf pour votre domaine ou sous-domaine. Par exemple ici je souhaite obtenir un certificat pour www.mondomaine.com :

./getssl -c www.mondomaine.com

Le fichier de conf est généré dans un répertoire caché .getssl, l’éditer et adapter les paramètres tels que ci-dessous : 

vim /root/.getssl/www.mondomaine.com/getssl.cfg
# Uncomment and modify any variables you need
# see https://github.com/srvrco/getssl/wiki/Config-variables for details
# see https://github.com/srvrco/getssl/wiki/Example-config-files for example configs
#
# The staging server is best for testing
#CA="https://acme-staging.api.letsencrypt.org" # Commenter cette ligne, il s'agit d'un serveur délivrant uniquement des certificats dans le cadre de tests
# This server issues full certificates, however has rate limits
CA="https://acme-v01.api.letsencrypt.org" # Dé-commenter cette ligne

#PRIVATE_KEY_ALG="rsa"

# Additional domains - this could be multiple domains / subdomains in a comma separated list
# Note: this is Additional domains - so should not include the primary domain.
SANS="" # A utiliser dans le cas où vous souhaitez obtenir un certificat pour un domaine ET un sous-domaine www. ou autre. Dans ce cas il faut indiquer le sous-domaine ici.

# Acme Challenge Location. The first line for the domain, the following ones for each additional domain.
# If these start with ssh: then the next variable is assumed to be the hostname and the rest the location.
# An ssh key will be needed to provide you with access to the remote server.
# Optionally, you can specify a different userid for ssh/scp to use on the remote server before the @ sign.
# If left blank, the username on the local server will be used to authenticate against the remote server.
# If these start with ftp: then the next variables are ftpuserid:ftppassword:servername:ACL_location
# These should be of the form "/path/to/your/website/folder/.well-known/acme-challenge"
# where "/path/to/your/website/folder/" is the path, on your web server, to the web root for your domain.
ACL=('/var/www/www.mondomaine.com/.well-known/acme-challenge') # Indiquer ici le répertoire où sera copié le token (c'est le répertoire qu'on a créé précédemment)
# 'ssh:server5:/var/www/www.mondomaine.com/web/.well-known/acme-challenge'
# 'ssh:sshuserid@server5:/var/www/www.mondomaine.com/web/.well-known/acme-challenge'
# 'ftp:ftpuserid:ftppassword:www.mondomaine.com:/web/.well-known/acme-challenge')

#Set USE_SINGLE_ACL="true" to use a single ACL for all checks
#USE_SINGLE_ACL="false"

# Location for all your certs, these can either be on the server (full path name)
# or using ssh /sftp as for the ACL
# Indiquer ci dessous le répertoire de destination où sera généré le certificat et sa clé privée. Le répertoire doit exister.
DOMAIN_CERT_LOCATION="/etc/nginx/ssl/www.mondomaine.com/www.mondomaine.com.crt"
DOMAIN_KEY_LOCATION="/etc/nginx/ssl/www.mondomaine.com/www.mondomaine.com.key"
CA_CERT_LOCATION="/etc/nginx/ssl/www.mondomaine.com/chain.crt"
#DOMAIN_CHAIN_LOCATION="" # this is the domain cert and CA cert
#DOMAIN_PEM_LOCATION="" # this is the domain_key, domain cert and CA cert

# The command needed to reload apache / nginx or whatever you use
#RELOAD_CMD=""

# Define the server type. This can be https, ftp, ftpi, imap, imaps, pop3, pop3s, smtp,
# smtps_deprecated, smtps, smtp_submission, xmpp, xmpps, ldaps or a port number which
# will be checked for certificate expiry and also will be checked after
# an update to confirm correct certificate is running (if CHECK_REMOTE) is set to true
SERVER_TYPE="https"
#CHECK_REMOTE="true"

Executer getssl suivi du domaine ou sous-domaine pour lequel on souhaite un certificat : 

./getssl www.mondomaine.com
Registering account
Verify each domain
Verifying www.mondomaine.com
copying challenge token to /var/www/www.mondomaine.com/.well-known/acme-challenge/ZkFYnTHgj6n0Vl1dcekvwyOwoNEUQ3xXrRZFaA0tKRs
Pending
Verified www.mondomaine.com
Verification completed, obtaining certificate.
Certificate saved in /root/.getssl/www.mondomaine.com/www.mondomaine.com.crt
The intermediate CA cert is in /root/.getssl/www.mondomaine.com/chain.crt
copying domain certificate to /etc/nginx/ssl/www.mondomaine.com/www.mondomaine.com.crt
copying private key to /etc/nginx/ssl/www.mondomaine.com/www.mondomaine.com.key
copying CA certificate to /etc/nginx/ssl/www.mondomaine.com/chain.crt
getssl: www.mondomaine.com - certificate obtained but certificate on server is different from the new certificate

A ce stade et si il n’y a pas eu d’erreurs, le certificat, sa clé privée et la chaine de certification ont été générés et placés dans le répertoire indiqué précédemment dans le fichier de conf.

Mettre en place le renouvellement automatique de ce certificat (ici tous les dimanches à 00:00) :

crontab -e
0 0 * * 0 /root/scripts/getssl -a

Le paramètre -a de getssl tentera de renouveler tous les certificats qui ont été générés par getssl. Pour éviter l’abus de renouvellement et d’être bloqué par Let’s Encrypt, getssl ne renouvellera un certificat uniquement si celui-ci expire dans moins de 30j. Inutile donc de planifier la crontab tous les jours.

Passage du site en HTTPS 

Maintenant que le certificat pour www.mondomaine.com est généré, il peut être utilisé par un vhost écoutant sur le port 443. Il existe plusieurs types de serveurs web et je ne vais pas détailler la configuration pour chacun d’entre eux. 

La bonne pratique étant que le vhost 80 redirige vers le vhost 443. Si une telle redirection est en place, pour les renouvellements de certificat il faudra que le répertoire .well-known/acme-challenge/ soit diffusé par le vhost 443 (et plus par le vhost 80).

Si vous avez des questions ou des difficultés à mettre en place ce vhost, n’hésitez pas à poser des questions en commentaires.

Vous aimerez aussi...

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

%d blogueurs aiment cette page :