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

 


Novakin

Passionné d'informatique depuis de longues années je me suis tourné vers Linux et des solutions de virtualisation il y a peu. Ce blog est une sorte de carnet de web où je partage mes mémos.

S’abonner
Notification pour

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

13 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires

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

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+

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+

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

13
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x