Oui, le titre est un peu « racoleur » mais c’est pourtant vrai !
J’avais pour habitude de générer mes certificats SSL/TLS (pour mes serveurs de courriels IMAP et SMTP, et aussi pour la partie administrative de ce présent blog) avec StartSSL, une des (la ?) seule compagnie qui proposait des certificats gratuits pour 1 an, et renouvelables.
Mais je suis dernièrement tombé sous le charme (initiative de la fondation linux) et la simplicité (processus entièrement automatisable à partir de la ligne de commande) de Let’s Encrypt.
Voici des instructions pour générer un certificat pour un site existant; elles sont issues de la documentation officielle et de mon expérience récente avec Let’s encrypt.
Mise à jour Août 2019
Il est maintenant recommander d’utiliser les paquets officiels de certbot plutôt que le repo git et letsencrypt-auto : pour cela, il suffit d’utiliser les instructions à : https://certbot.eff.org/
Concernant l’installation sous Ubuntu pour Apache2 en mode « j’édite mes fichiers de conf. Apache2 tout seul« , çà donne :
| 
					 1 2 3 4 5 6  | 
						sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository universe sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install certbot python-certbot-apache   | 
					
Ceci étant fait, pour invoquer certbot, on utilisera :
| 
					 1  | 
						sudo certbot certonly --apache  | 
					
La magie de certboot sur Ubuntu 18, c’est qu’il ajoute automatiquement un timer :
| 
					 1 2  | 
						systemctl list-timers Tue 2019-08-20 11:07:10 EDT 19h left Mon 2019-08-19 14:22:34 EDT 1h 11min ago certbot.timer certbot.service  | 
					
On peut vérifier le statut du timer :
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						systemctl status certbot ● certbot.service - Certbot    Loaded: loaded (/lib/systemd/system/certbot.service; static; vendor preset: enabled)    Active: inactive (dead) since Mon 2019-08-19 15:27:31 EDT; 6min ago      Docs: file:///usr/share/doc/python-certbot-doc/html/index.html            https://letsencrypt.readthedocs.io/en/latest/   Process: 6880 ExecStart=/usr/bin/certbot -q renew (code=exited, status=0/SUCCESS)  Main PID: 6880 (code=exited, status=0/SUCCESS) août 19 15:27:28 poulca systemd[1]: Starting Certbot... août 19 15:27:31 poulca systemd[1]: Started Certbot.  | 
					
Et dormir sur ses 2 oreilles : un service certbot vérifiera tous les jours si des certificats doivent être renouvelés !
Installation du client letsencrypt
Rien de bien particulier : il suffit d’avoir auparavant installé git et python 2 sur sa machine et de cloner le repo git de letsencrypt :
| 
					 1 2 3  | 
						$ git clone https://github.com/letsencrypt/letsencrypt $ cd letsencrypt $ ./letsencrypt-auto --help  | 
					
Vous devriez voir, si tout s’est bien passé la sortie suivante :
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 
						Updating letsencrypt and virtual environment dependencies...... Requesting root privileges to run with virtualenv: sudo /home/anthony/.local/share/letsencrypt/bin/letsencrypt --help [sudo] password for user:   letsencrypt [SUBCOMMAND] [options] [-d domain] [-d domain] ... The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates.  By default, it will attempt to use a webserver both for obtaining and installing the cert. Major SUBCOMMANDS are:   (default) run        Obtain & install a cert in your current webserver   certonly             Obtain cert, but do not install it (aka "auth")   install              Install a previously obtained cert in a server   revoke               Revoke a previously obtained certificate   rollback             Rollback server configuration changes made during install   config_changes       Show changes made to server config during installation   plugins              Display information about installed plugins Choice of server plugins for obtaining and installing cert:   --apache          Use the Apache plugin for authentication & installation   --standalone      Run a standalone webserver for authentication   (nginx support is experimental, buggy, and not installed by default)   --webroot         Place files in a server's webroot folder for authentication OR use different plugins to obtain (authenticate) the cert and then install it:   --authenticator standalone --installer apache More detailed help:   -h, --help [topic]    print this message, or detailed help on a topic;                         the available topics are:    all, automation, paths, security, testing, or any of the subcommands or    plugins (certonly, install, nginx, apache, standalone, webroot, etc)  | 
					
Génération de certificats sans arrêter Apache2, méthode webroot
Par défaut, letsencrypt permet de tout automatiser : la création du certificat et l’ajout du certificat à votre configuration Apache2 (ou Nginx d’ailleurs). Si vous ne voulez pas courir le risque d’abimer votre configuration accidentellement, je vous suggère d’utiliser le mode semi automatisé, webroot, qui va générer le certificat pour peu que vous lui indiquiez la racine des documents de votre site.
Par exemple, si le contenu de blog.dahanne.net est dans /var/www/blog.dahanne.net et que vous voulez que votre certificat couvre à la fois blog.dahanne.net et www.blog.dahanne.net :
| 
					 1  | 
						$ ./letsencrypt-auto certonly --webroot -w /var/www/blog.dahanne.net/ -d www.blog.dahanne.net -d blog.dahanne.net  | 
					
Vous devriez obtenir en sortie :
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						Updating letsencrypt and virtual environment dependencies...... Requesting root privileges to run with virtualenv: sudo /home/anthony/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /var/www/blog.dahanne.net/ -d blog.dahanne.net IMPORTANT NOTES:  - Congratulations! Your certificate and chain have been saved at    /etc/letsencrypt/live/blog.dahanne.net/fullchain.pem. Your cert    will expire on 2016-04-10. 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  | 
					
et voilà ! vos certificats vous attendent dans /etc/letsencrypt/live/blog.dahanne.net :
| 
					 1 2  | 
						$ ls  /etc/letsencrypt/live/blog.dahanne.net/ cert.pem  chain.pem  fullchain.pem  privkey.pem  | 
					
Modification de votre VirtualHost Apache2 pour l’ajout HTTPS
Encore une fois la documentation officielle est bien détaillée : vous pouvez modifier votre fichier de configuration de site Apache 2 (normalement sous /etc/apache2/sites-enabled/blog.dahanne.net) en le passant de :
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13  | 
						<VirtualHost *:80>     ServerAdmin valide@email.ca     DocumentRoot /var/www/blog.dahanne.net     ServerName blog.dahanne.net     ErrorLog /var/log/apache2/blog.dahanne.net.error.log     CustomLog /var/log/apache2/blog.dahanne.net.access.log combined     <Directory /home/www/blog.dahanne.net>             AllowOverride FileInfo AuthConfig Limit Options             Options -Indexes MultiViews FollowSymLinks IncludesNoExec             Order allow,deny             Allow from all     </Directory> </VirtualHost>  | 
					
à :
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46  | 
						<VirtualHost *:80>     ServerAdmin valide@email.ca     DocumentRoot /var/www/blog.dahanne.net     ServerName blog.dahanne.net     ErrorLog /var/log/apache2/blog.dahanne.net.error.log     CustomLog /var/log/apache2/blog.dahanne.net.access.log combined     # optionnel, pour rediriger tout le trafic clair en chiffré     #Redirect permanent / https://blog.dahanne.net/     <Directory /home/www/blog.dahanne.net>             AllowOverride FileInfo AuthConfig Limit Options             Options -Indexes MultiViews FollowSymLinks IncludesNoExec             Order allow,deny             Allow from all     </Directory> </VirtualHost> <VirtualHost *:443>     ServerAdmin valide@email.ca     DocumentRoot /var/www/blog.dahanne.net     ServerName blog.dahanne.net     ErrorLog /var/log/apache2/blog.dahanne.net.error.log     CustomLog /var/log/apache2/blog.dahanne.net.access.log combined     <Directory /var/www/blog.dahanne.net>             AllowOverride FileInfo AuthConfig Limit Options             Options -Indexes MultiViews FollowSymLinks IncludesNoExec             Order allow,deny             Allow from all     </Directory>     SSLEngine On     SSLProtocol all -SSLv2     SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM     SSLProxyEngine On     SSLCertificateKeyFile /etc/letsencrypt/live/blog.dahanne.net/privkey.pem     # si apache2 < 2.4.8     SSLCertificateFile   /etc/letsencrypt/live/blog.dahanne.net/cert.pem     # si apache2 < 2.4.8     SSLCertificateChainFile /etc/letsencrypt/live/blog.dahanne.net/chain.pem     # si apache2 > 2.4.8     # SSLCertificateFile   /etc/letsencrypt/live/blog.dahanne.net/fullchain.pem </VirtualHost>  | 
					
Il vous suffit alors de recharger la configuration :
| 
					 1 2  | 
						$ sudo service apache2 reload  * Reloading web server config apache2                                              [ OK ]  | 
					
et de tester https://blog.dahanne.net
Vous paierez particulièrement attention à la validité du certificat, (un jolie cadenas vert)

et aussi à sa date de péremption : dans 3 mois seulement !

3 mois, comparé à 1 an de StartSSL, c’est un peu court, mais n’ayez crainte ! un ajout dans la crontab et le renouvellement sera automatique !
Renouveler automatiquement votre certificat letsencrypt
Le certificat est valide 3 mois, mais pour être sûr de ne pas être en retard (et pour faciliter la tâche cron :-P) on va renouveler le certificat tous les mois.
Il suffit de rajouter dans /etc/cron.monthly/ un petit script shell :
| 
					 1  | 
						$ sudo vim /etc/cron.monthly/letsencrypt.sh  | 
					
avec :
| 
					 1 2 3 4  | 
						#!/bin/sh /home/anthony/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/blog.dahanne.net/  -d blog.dahanne.net --renew-by-default # ou sinon les certificats ne sont pas rechargés par le serveur web ! service apache2 reload  | 
					
C’est identique à la commande de création, avec un drapeau en plus, –renew-by-default
Bonus : certificats Letsencrypts pour les courriels (SMTP et IMAP)
Pour le smtp, avec postfix :
| 
					 1  | 
						sudo vim /etc/postfix/main.cf  | 
					
| 
					 1 2  | 
						smtpd_tls_cert_file = /etc/letsencrypt/live/blog.dahanne.net/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/blog.dahanne.net/privkey.pem  | 
					
Pour l’imap, avec dovecot :
| 
					 1  | 
						sudo vim /etc/dovecot/conf.d/10-ssl.conf  | 
					
| 
					 1 2  | 
						ssl_cert = </etc/letsencrypt/live/blog.dahanne.net/fullchain.pem ssl_key = </etc/letsencrypt/live/blog.dahanne.net/privkey.pem  | 
					
On peut recharger, et c’est fini !
| 
					 1 2  | 
						sudo service dovecot restart sudo service postfix restart  | 
					
En conclusion
Le fait de pouvoir rajouter autant de certificats que l’on veut pour tous ses sous domaines, très simplement à partir de la ligne de commande constitue un fort avantage de Let’s Encrypt par rapport à d’autres solutions gratuites (et payantes !) : plus de processus manuels à travers son navigateur, de renouvellement avec certificat d’identité, etc.
Tellement facile à utiliser, qu’il n’y a plus d’excuses à utiliser de certificats auto généré, ou de connexions non chiffrées !