Vendredi 23 novembre 2018

2017-04-30-Letsencrypt-Installer-configurer-renouveler-un-certificat-SSL


layout: post title: “Installer configurer renouveler un certificat SSL letsencrypt” ref: tutoriel date: 2016-04-20 categories: [linux] tags: [serveur] lang: fr description: Let’s Encrypt —

Installer configurer renouveler un certificat SSL letsencrypt

Installer Let’s Encrypt

Télécharger Let’s Encrypt

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

Créer un fichier de configuration pour le domaine concerné (ici domaine.tld)

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

Dans ce fichier de configuration nous allons indiquer :

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

Copier et coller les lignes suivantes dans le fichier domaine.tld-webroot.ini ,adapter les variables (email, domains, webroot-path).


    # We use a 4096 bit RSA key instead of 2048
    rsa-key-size = 4096
     
    email = webmaster@domaine.tld
    domains = map.domaine.tld, static.domaine.tld, blog.domaine.tld, forum.domaine.tld, wiki.domaine.tld, 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

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

Sauvegarder la configuration NGINX actuelle

  sudo mv /etc/nginx/conf.d/domaine.tld.conf /etc/nginx/conf.d/domaine.tld.conf.SAV 

Créer une configuration pour générer les certificats letsencrypt

  sudo nano /etc/nginx/conf.d/domaine.tld.letsencrypt.conf	
    server {
        listen  [::]:80;
        listen 80;
        server_name domaine.tld *.domaine.tld;
      root /var/www;
      location ~/.well-known/acme-challenge {
        allow all;
     }
    }

La zone DNS domaine.tld étant paramétrée avec un wildcard (CNAME) ,il est possible de générer un certificat pour le domaine et les sous-domaines avec une seule exécution du script.

Relancer le service NGinx

    sudo systemctl restart nginx

Obtenir un certificat SSL

Pour l’obtention du certificat SSL, exécuter commande suivante (ajuster la variable email ainsi que le chemin du fichier de configuration –config)

    sudo /opt/letsencrypt/letsencrypt-auto certonly --email webmaster@domaine.tld --agree-tos --config /usr/local/etc/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/domaine.tld/fullchain.pem. Your cert will
   expire on 2016-07-17. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.

Mettre à jour la configuration de NGinx

Sauvegarder la configuration domaine.tld.letsencrypt.conf pour le renouvellement des certificats

  sudo mv /etc/nginx/conf.d/domaine.tld.letsencrypt.conf /etc/nginx/conf.d/domaine.tld.letsencrypt.conf.SAV	

Restaurer la configuration domaine.tld.conf originale

  sudo mv /etc/nginx/conf.d/domaine.tld.conf.SAV /etc/nginx/conf.d/domaine.tld.conf

Dans la configuration domaine.tld.conf :

  • certificat : /etc/yunohost/certs/domaine.tld/crt.pem
  • clé : /etc/yunohost/certs/domaine.tld/key.pem

On va créer des liens sur le nouveau certificat et la clé après avoir effacé les anciens fichiers

sudo rm /etc/yunohost/certs/domaine.tld/crt.pem
sudo rm /etc/yunohost/certs/domaine.tld/key.pem
sudo ln -s /etc/letsencrypt/live/domaine.tld/fullchain.pem /etc/yunohost/certs/domaine.tld/crt.pem
sudo ln -s /etc/letsencrypt/live/domaine.tld/privkey.pem /etc/yunohost/certs/domaine.tld/key.pem

Relancer le service NGinx

sudo systemctl restart nginx

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 .

ATTENTION! La configuration spécifique à Yunohost ne permet pas de façon simple un renouvellement automatique du certificat letsencrypt

Cas général

Les procédures suivantes ne peuvent pas être mises en place avec YUNOHOST

Il faut créer 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-domaine.tld.sh

Collez les lignes ci-dessous

#!/bin/bash
     
    WEB_SERVICE='nginx'
    CONFIG_FILE='/usr/local/etc/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-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-domaine.tld.sh

Rendez ce fichier exécutable

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

Cas Yunohost

Dans ce cas particulier , le renouvellement du certificat ne sera pas entièrement automatique .Le serveur sera SUSPENDU pendant quelques minutes , temps nécessaire au renouvellement du certificat.
Création du fichier qui sera exécuté pour le renouvellement

  sudo nano /usr/local/etc/renew-domaine.sh

Copier le contenu ci-dessous dans le fichier /usr/local/etc/renew-domaine.sh

#!/bin/bash

#Tester le nombre de paramètres de la ligne de commande ,il  en faut un
if [ "$#" -eq "1" ] ; then
 echo "Domaine $1"
else
 echo "Un nom de domaine comme paramètre !"
 exit 1;
fi

  WEB_SERVICE="nginx"
  CONFIG_FILE="/usr/local/etc/$1-webroot.ini"
  LE_PATH="/opt/letsencrypt"
  EXP_LIMIT=5  # Renouvellement 5 jours avant date expiration

  CERT_FILE="/etc/letsencrypt/live/$1/fullchain.pem"
  NGINX_CONF="/etc/nginx/conf.d/$1.conf"
  LETSENCRYPT_CONF="/etc/nginx/conf.d/$1.letsencrypt.conf"

    if [ ! -f $CONFIG_FILE ]; then
     echo "[ERREUR] fichier de configuration $CONFIG_FILE inexistant"
     exit 1;
    fi
  DOMAIN=`grep "^\s*domains" $CONFIG_FILE | sed "s/^\s*domains\s*=\s*//" | sed 's/(\s*)\|,.*$//'`

  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 "Vérification date expiration domaine  $DOMAIN..."

    if [ "$EXP_DAYS" -gt "$EXP_LIMIT" ] ; then
     echo "Pas de renouvellement ,expiration certificat dans $EXP_DAYS jour(s)."
     exit 0;
    else
     echo "Le certificat du domaine $DOMAIN expire dans $EXP_LIMIT jour(s). Démarrage du script..."
     echo "Sauvegarde configuration $NGINX_CONF"
       mv $NGINX_CONF $NGINX_CONF.SAV
     echo "Restaurer la configuration $LETSENCRYPT_CONF"
       mv $LETSENCRYPT_CONF.SAV $LETSENCRYPT_CONF
     echo "Relancer nginx"
       systemctl restart $WEB_SERVICE
     echo "Lancement processus de renouvellement des certificats"
       $LE_PATH/letsencrypt-auto certonly --renew-by-default --config $CONFIG_FILE
     echo "Restaurer la configuration $NGINX_CONF "
       mv $NGINX_CONF.SAV $NGINX_CONF
     echo "Sauvegarder la configuration $LETSENCRYPT_CONF"
       mv $LETSENCRYPT_CONF $LETSENCRYPT_CONF.SAV
     echo "Relancer nginx"
       systemctl restart $WEB_SERVICE
     echo "Renouvellement du domaine $DOMAIN TERMINE"
     exit 0;
    fi

Donner les droits d’exécution au fichier

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

Lancer manuellement , l’exécution

  sudo -s
  /usr/local/etc/renew-domaine.sh domaine_a_renouveler

Dans le cas d’un renouvellement correct , ce qui suit devrait apparaître sur l’écran

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/domaine.tld/fullchain.pem. Your cert will
   expire on 2016-08-07. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le