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
- Vincent Composieux, vincent.composieux.fr, Installer, configurer et renouveller automatiquement un certificat SSL Let’s Encrypt (French)