Installer configurer et renouveler automatiquement un certificat SSL Let’s Encrypt

Let’s Encrypt est passé depuis quelques temps déjà en beta publique. Vous pouvez donc obtenir rapidement mais surtout gratuitement des certificats SSL pour vos domaines et sous domaines. Contrairement à START SSL vous pouvez gratuitement modifier vos certificats pour y inclure de nouveaux sous-domaines et tout cela directement en ligne de commande. Cependant deux petits bémols : vous ne pouvez pas pour le moment obtenir de certificat wilcard, vous devez donc indiquer tous les sous domaines sur lesquels vous souhaitez utiliser HTTPS, et ces certificats ne sont valables que 90 jours. Je vais donc ici vous expliquer comment vous pouvez assez facilement installer configurer et renouveler automatiquement un certificat SSL Let’s Encrypt.

 

 

Installer Let’s Encrypt

Commencons tout d’abord par télécharger Let’s Encrypt

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

 

Maintenant nous allons créer un fichier de configuration pour le domaine sur lequel nous souhaitons utiliser HTTPS (bien sur remplacez votre-domaine.tld par votre propre nom de domaine)

sudo nano /usr/local/etc/votre-domaine.tld-webroot.ini

 

Dans ce fichier de configuration nous allons indiquer :

  • le type de clé utilisé
  • l’email de l’administrateur du domaine
  • le domaine et les sous-domaines concernés
  • la méthode d’authentification Let’s Encrypt utilisée

Copiez et collez les lignes suivantes dans le fichier précédemment ouvert et adaptez les variables (email, domains et webroot-path) selon votre configuration. Je vous conseille fortement d’indiquer le répertoire ou sont stockés les fichiers de votre domaine principale pour la variable webroot-path

# We use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096

email = webmaster@votre-domain.tld
domains = votre-domaine.tld, blabla.votre-domaine.tld, blabla2.votre-domaine.tld

authenticator = webroot

# This is the webroot directory of your domain in which
# letsencrypt will write a hash in /.well-known/acme-challenge directory.
webroot-path = /var/www/www.votre-domaine.tld

 

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 (ici votre-domaine.tld)

 

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"

 

Dans mon cas j’ai :

  • crée un CNAME Wildcard dans ma zone DNS renvoyant sur noobunbox.net
  • la même variable root du bloc NGinx webroot authentification lets encrypt sur tous mes sous-domaines ( ici /var/www/www.votre-domaine.tld/)

Ainsi je peux obtenir un certificat pour mon domaine et tous mes sous-domaines via un seul et même run du script mais surtout certifier des sous domaines qui ne sont pas encore déjà configurés sur mon serveur WEB. Je vous conseille donc de faire la même chose.

Relancez maintenant la configuration de NGinx / Apache

sudo service nginx reload
sudo service apache2 reload

 

 

Obtenir un certificat SSL

Le fichier de configuration est prêt nous allons pouvoir obtenir notre certificat SSL, lançons donc la commande suivante (modifiez la variable email et celle indiquant ou se trouve votre fichier de configuration)

sudo /opt/letsencrypt/letsencrypt-auto certonly --email webmaster@votre-domaine.tld --agree-tos --config /usr/local/etc/votre-domaine.tld-webroot.ini

 

Let’s Encrypt vous indique que tout s’est correctement déroulé et où se trouvent vos certificats

- Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/votre-domaine.tld/fullchain.pem. 

Your cert will expire on 2016-06-03. 

To obtain a new version of the certificate in the future, simply run Let's Encrypt again.

 

 

Mettre à jour la configuration de NGinx et Apache

Nous allons donc maintenant pouvoir mettre à jour la configuration NGinx et nos domaines et sous domaines.

 

NGinx (1.8.0 minimum)

server {
listen 443 ssl;
server_name votre-domaine.tld;

ssl_certificate /etc/letsencrypt/live/votre-domaine.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/votre-domaine.tld/privkey.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
}

 

Apache (2.4.0 minimum)

<IfModule mod_ssl.c>
<VirtualHost *:443>
 ...
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/votre-domaine.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/votre-domaine.tld/privkey.pem
 ...
</VirtualHost>
</IfModule>

# intermediate configuration, tweak to your needs
SSLProtocol all -SSLv3
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on

 

Relancez maintenant la configuration de NGinx / Apache

sudo service nginx reload
sudo service apache2 reload

 

Visitez votre site et vérifiez que tout fonctionne correctement.

 

 

Renouveler automatiquement un certificat SSL Let’s Encrypt

Votre site configuré en HTTPS est maintenant fonctionnel, mais votre certificat n’est valable que 90 jours : nous allons donc mettre en place un script de renouvellement automatique. Celui-ci s’exécutera tous les jours via cron.

Commençons donc par installer un paquet nécessaire puis ensuite créer notre script

sudo apt-get install bc
sudo nano /usr/local/etc/renew-votre-domaine.tld.sh

 

Collez les lignes ci-dessous (modifiez la variable WEB_SERVICE si vous utilisez apache2 et indiquez le chemin de votre fichier de configuration variable CONFIG_FILE)

#!/bin/bash

WEB_SERVICE='nginx'
CONFIG_FILE='/usr/local/etc/votre-domaine.tld-webroot.ini'
LE_PATH='/opt/letsencrypt'
EXP_LIMIT=30;

if [ ! -f $CONFIG_FILE ]; then
 echo "[ERROR] config file does not exist: $CONFIG_FILE"
 exit 1;
fi

DOMAIN=`grep "^\s*domains" $CONFIG_FILE | sed "s/^\s*domains\s*=\s*//" | sed 's/(\s*)\|,.*$//'`
CERT_FILE="/etc/letsencrypt/live/$DOMAIN/fullchain.pem"

if [ ! -f $CERT_FILE ]; then
 echo "[ERROR] certificate file not found for domain $DOMAIN."
fi

DATE_NOW=$(date -d "now" +%s)
EXP_DATE=$(date -d "`openssl x509 -in $CERT_FILE -text -noout | grep "Not After" | cut -c 25-`" +%s)
EXP_DAYS=$(echo \( $EXP_DATE - $DATE_NOW \) / 86400 |bc)

echo "Checking expiration date for $DOMAIN..."

if [ "$EXP_DAYS" -gt "$EXP_LIMIT" ] ; then
 echo "The certificate is up to date, no need for renewal ($EXP_DAYS days left)."
 exit 0;
else
 echo "The certificate for $DOMAIN is about to expire soon. Starting webroot renewal script..."
 $LE_PATH/letsencrypt-auto certonly --renew-by-default --config $CONFIG_FILE
 echo "Reloading $WEB_SERVICE"
 /usr/sbin/service $WEB_SERVICE reload
 echo "Renewal process finished for domain $DOMAIN"
 exit 0;
fi

 

Rendons ce fichier exécutable

sudo chmod +x /usr/local/etc/renew-votre-domaine.tld.sh

 

Créez un script cron

sudo nano /etc/cron.daily/letsencrypt

 

Indiquez le chemin de votre script de renouvellement

#!/bin/bash
/usr/local/etc/renew-votre-domaine.tld.sh

 

Rendez ce fichier exécutable

sudo chmod +x /etc/cron.daily/letsencrypt

 

Source