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
- Abyssproject, Create a ECDSA certificate with Let’s Encrypt