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
Hello. Merci pour votre article.
Dommage que vous utilisez un rm -rf … dans un script alors qu’il s’adresse d’après le nom de votre site à une cible … non avertie. Un simple mv à un endroit choisi, par exemple dans un volume ou un disque dédié est pour moi largement plus résilient et éduque les jeunes administrateurs système à ne pas utiliser des commandes non réversibles à tour de bras. Bon on est vendredi et j’ai sûrement besoin de repos. 🙂 mais quand même
Bonjour Cloug !
Merci pour votre commentaire 🙂
Vous avez tout à fait raison !
C’est corrigé. Désormais le script crée un second répertoire nommé tempsave. Il y a donc maintenant deux sauvegardes du certificat 🙂
Deuxième update :
Le certificat déjà installé n’est pas modifié si la génération via le client Let’s Encrypt échoue
Salut !
C’est pas plus simple de tester la valider d’un certificat ainsi:
openssl x509 -in /etc/letsencrypt/live-ecdsa/$MAINDOMAIN/chain.pem -noout -checkend
« $? » = 0 ou 1
😉
A+
Pour être franc j’ai ré-utilisé la commande d’un script précédent : https://www.noobunbox.net/serveur/auto-hebergement/installer-configurer-renouveler-automatiquement-un-certificat-ssl-lets-encrypt
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
… etc …
J’ai un doute sur « chain.pem » (mais j’ai parcouru votre script en biais aussi!!!)
Chez moi, c’est « fullchain.pem » et « certs.pem » qui contiennent la date d’expiration des certificats.
Dans « chain.pem », c’est la date limite de l’autorité du certificat qui ressort:
# openssl x509 -in chain.pem -noout -dates
notBefore=Mar 23 22:59:04 2016 GMT
notAfter=Mar 23 22:59:04 2036 GMT
A+
Je vous remercie. Je fais quelques tests d’ici demain et je reviens vers vous 🙂
Bonjour Thierry
Merci pour la commande !
Elle fonctionne parfaitement 🙂
Correction du script
Merci je suis passé aux certificats ECDSA grâce à toi ! Et je me suis même crée un petit script pour automatiser la création d’un certificat pour un nouveau domaine !
J’ai vu qu’à l’heure actuelle il n’était pas possible de faire des certificats au delà de 384 bits, mais au niveau du SHA tu penses qu’il est possible de passer à du SHA384 au lieu du SHA256 ?
Alors, c’est l’autorité de certification qui délivre ton certificat en SHA-2 256. Tu peux de ton coté utilisé du SHA-2 en 384 ou 512 seulement ton certificat sera auto-signé.
Ensuite pas sur que les navigateurs / OS seraient compatibles.
Ah oui je vois, donc ce n’est judicieux de mettre SHA384 au lieu de SH256 lors de la commande suivante : 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
Ah oui si les navigateurs/OS ne sont pas compatibles, alors ce n'est pas tellement une bonne idée d'y passer xD
MAJ du script afin de le rendre compatible avec les dernières versions de Certbot