Renouveler automatiquement un certificat ECDSA Let’s Encrypt

14 avril 2016 Auto-hébergement 13 Commentaires

Let’s encrypt offre depuis un petit moment déjà la possibilité de générer des certificats ECDSA. Comme je suis un peu feignant je me suis demander comment je pouvais renouveler automatiquement un certificat ECDSA Let’s Encrypt, j’en profite donc pour rédiger un petit mémo.

 

 

Générer un certificat ECDSA avec Let’s Encrypt

Si ce n’est pas déjà fait, téléchargez Let’s Encrypt

git clone https://github.com/letsencrypt/letsencrypt
mv letsencrypt /opt/

 

Afin que l’authentification fonctionne correctement ajoutez les lignes suivantes dans la configuration de votre domaine principal et de tous les sous-domaines que vous souhaitez certifier.

 

NGinx

# webroot authentification lets encrypt 
location '/.well-known/acme-challenge' {
root /var/www/www.votre-domaine.tld/;
try_files $uri /$1;
}

 

Apache2

# webroot authentification lets encrypt 
Alias /.well-known/acme-challenge  "/var/www/www.votre-domaine.tld/.well-known/acme-challenge"

 

Après avoir effectué ces modifications relancez la configuration de votre serveur Web

Maintenant créez les dossiers nécessaires

mkdir -p /etc/letsencrypt/live-ecdsa/votre-domaine.tld/letmp

 

Déplacez vous dans le dossier qui contiendra votre certificat et générez une clé privée

cd /etc/letsencrypt/live-ecdsa/votre-domaine.tld/
openssl ecparam -genkey -name secp384r1 > privkey-p384.pem

 

Maintenant vous allez devoir générer un CSR, appuyez vous sur l’exemple ci-dessous (ici nous générerons un CSR pour un domaine (votre-domaine.tld) et un sous-domaine (www.votre-domaine.tld). Libre à vous de rajouter d’autres sous-domaines

openssl req -new -sha256 -key privkey-p384.pem -subj "/CN=votre-domaine.tld" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:votre-domaine.tld,DNS:www.votre-domaine.tld")) -outform der -out csr-p384.der

 

Vous disposez maintenant de votre clé privée privkey-p384.pem et de votre CSR csr-p384.der. Nous allons maintenant pouvoir générer un certificat ECDSA via Let’s Encrypt

cd letmp
/etc/letsencrypt/letsencrypt-auto certonly -a webroot --email emain@votre-domaine.tld --webroot-path /var/www/www.votre-domaine.tld/ --csr /etc/letsencrypt/live-ecdsa/votre-domaine.td/csr-p384.der --renew-by-default --agree-tos
cat 0001* > /etc/letsencrypt/live-ecdsa/votre-domaine/chain.pem

 

 

Mettez à jour la configuration de votre serveur WEB :

  • Comme certificat indiquez /etc/letsencrypt/live-ecdsa/votre-domaine/chain.pem
  • Comme clé privée indiquez /etc/letsencrypt/live-ecdsa/votre-domaine/privkey-p384.pem

 

 

Renouveler automatiquement un certificat ECDSA Let’s Encrypt

Si tout fonctionne correctement, vous pouvez passer à la suite. Créez un fichier qui contiendra notre script.

cd /usr/local/etc/
sudo nano votre-domaine.tld-renew.sh

 

Maintenant collez le code suivant

#!/bin/bash

## Change this
MAINDOMAIN="votre-domaine.tld" #Domaine a renouveler
EMAIL="email@votre-domaine.tld" #Votre email
WEBROOT="/var/www/www.votre-domaine.tld" # Racine du domaine
WEB_SERVICE="nginx" #NGinx ou Apache2 
LE_PATH="/opt/letsencrypt" #Path du client Let's Encrypt
EXP_LIMIT=40; #Date limite renouvellement cert


if [ ! -f /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/chain.pem ]; then
 echo "[ERROR] certificate file not found for domain $MAINDOMAIN."
fi

if [ ! -f /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/csr-p384.der ]; then
 echo "[ERROR] CSR file for domain $MAINDOMAIN missing. Exiting"
 exit 1
fi

## Expiration limit check
echo "Checking expiration date for $MAINDOMAIN..."
if openssl x509 -in /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/chain.pem -noout -checkend $(( EXP_LIMIT*24*3600 )) ; then
echo "The certificate is up to date, no need for renewal."
exit 0;
else
echo "The certificate for $MAINDOMAIN is about to expire soon. Starting webroot renewal script..."

## Saving previous certs
if [ ! -e /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp.save/ ]; then
 mkdir /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp.save/
fi

mv -f /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp/*.pem /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp.save/


## Certificate generation
cp /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/chain.pem /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/chain.pem.save
cd /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp/
$LE_PATH/letsencrypt-auto certonly --text --agree-tos --email $EMAIL --webroot --webroot-path $WEBROOT --csr /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/csr-p384.der --renew-by-default


## We won't replace the current cert if let's encrypt could not issue a new cert
if [ ! -f /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp/0001*.pem ] ; then
cp -f /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp.save/*.pem /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/letmp/
echo "[ERROR] No certificate issued by Let's Encrypt. Your previous certificate will not be modified"
 exit 0;
fi

cat 0001* > /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/chain.pem

 echo "Reloading $WEB_SERVICE"
 /usr/sbin/service $WEB_SERVICE reload
 echo "Renewal process finished for domain $MAINDOMAIN"
 exit 1;
fi

 

Sachez que le script sauvegarde le certificat actuel avant tout renouvellement. La sauvegarde s’effectue dans le fichier /etc/letsencrypt/live-ecdsa/votre-domaine.tld/chaine.pem.save. Une seconde sauvegarde est effectuée : les certificats présents dans /etc/letsencrypt/live-ecdsa/votre-domaine/letmp/ sont sauvegardés automatiquement dans le dossier letmp.save (Un grand merci à Cloug & à Thierry)

J’ai aussi ajouté une seconde sécurité. Si la génération du certificat via le client Let’s Encrypt échoue. Le certificat actuel ne sera pas remplacé

 

Après avoir modifié les variables du script, accordez lui les droits nécessaires

chmod +x votre-domaine.tld-renew.sh

 

Vous pouvez lancer le script en exécutant la commande suivante

./votre-domaine.tld-renew.sh

 

Voilà vous savez maintenant comment renouveler automatiquement un certificat ECDSA Let’s Encrypt

 

 

Quelle configuration pour un certificat ECDSA ?

Ci-dessous un exemple de configuration pour NGinx. Elle reste assez générale, si vous souhaitez encore mieux sécuriser HTTPS consultez ce mémo (à partir de la section Sécuriser HTTPS : HSTS)

server {

#------------------------------------------------------------------------
# GENERAL
#
 listen 443 ssl http2;
 server_name votre-domaine.tld;
 root /var/www/www.votre-domaine.tld;
 index index.php index.html index.htm;

#------------------------------------------------------------------------
# SSL
#
 ssl_certificate /etc/letsencrypt/live-ecdsa/votre-domaine.tld/chain.pem;
 ssl_certificate_key /etc/letsencrypt/live-ecdsa/votre-domaine.tld/privkey-p384.pem;
 ssl_trusted_certificate /etc/letsencrypt/live-ecdsa/votre-domaine.tld/chain.pem;

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #Vous pouvez supprimer TLSv1 et TLSv1.1 si vous le souhaitez
 ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384';
 ssl_ecdh_curve secp384r1;
 ssl_prefer_server_ciphers on;

 # ssl optimizations
 ssl_session_timeout 5m;
 ssl_session_cache shared:SSL:20m;
 ssl_session_tickets off;
 ssl_stapling on;
 ssl_stapling_verify on;
 resolver 8.8.8.8 8.8.4.4 valid=300s;
 resolver_timeout 15s;

}

 

Merci à Cloug et Thierry pour leurs corrections

 

Source