Installer un certificat SSL LetsEncrypt sous Apache 2.4
(Tuto réalisé sous ubuntu 16.04 mais qui doit être assez simple à adapter pour d’autres distributions)
1. Installation de certbot-auto
L’outil certbot-auto de l’EFF facilite la création et le renouvellement de certificat ainsi que la configuration du vhost.
En root, exécuter :
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
mv certbot-auto /usr/local/bin/
2. Création et installation du certficat SSL pour votre domaine
On veut créer un certificat avec une clé 4096 bits pour notre domaine et, configurer le vhost Apache correspondant, ça donne :
certbot-auto --rsa-key-size 4096 --apache -d ayozone.org -d www.ayozone.org
Note: si vous utilisez la commande sudo pour avoir les droits root, pour la commande si dessus il faudra utiliser le paramètre -H soit :
sudo -H certbot-auto --rsa-key-size 4096 --apache -d ayozone.org -d www.ayozone.org
Certbot-auto va demander un mail à associer avec le certificat. Puis demander si l’on souhaite recevoir la newsletter. Ensuite, il passe à la vérification du domaine, puis à la création du certificat. Si tout se passe bien, il demande ensuite comment on souhaite gérer HTTP et HTTPS : pouvoir accèder aux deux ou, rediriger HTTP vers HTTPS systématiquement. Ici, choisir rediriger HTTP vers HTTPS Après avoir ajouté sa config à notre vhost, il reload apache. Ça y est votre site est en HTTPS \o/
Cependant, si on le teste sur https://cryptcheck.fr, la note n’est vraiment pas terrible. Voyons donc ce que l’on peut faire pour améliorer cette note.
3. Les paramètres du mod_ssl d’apache
Ces paramètres se trouvent par défaut dans /etc/mods-available/mod_ssl.conf
Cependant, certbot-auto en configurant notre vhost à inclus une portion de configuration avec ses propres paramètres. Il serait sans doute plus propre de demander à certbot-auto au départ de ne générer que le certificat et de faire toute la configuration apache à la main, mais j’ai choisi la facilité en bon flemmard de base.
Donc je vais copier le fichier inclus par certbot-auto puis modifier ou ajouter mes paramètres ssl dans ce nouveau fichier
cp /etc/letsencrypt/options-ssl-apache.conf /etc/apache2/mes-params-ssl.conf
4. Protocoles SSL
Il existe plusieurs protocoles SSL : SSLv3, SSLv2, TLS 1.0, TLS 1.1 et TLS, 1.2 En gros, pour être bien, il ne faut utiliser que TLS 1.2, ce qui donne en config (dans le fichier que l’on vient de copier à l'étape précédente) :
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
5. Cipher suite
La suite cryptographique est importante. Je ne suis pas très connaisseur, alors j’ai suivi la recommendation d’Angristan (https://angristan.fr/configurer-https-nginx/) qui suit les recommendation de l’ANSSI et utilise la cipher suite suivante :
SSLCipherSuite EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES
(Cette ligne est à mettre à la place de l’existante dans /etc/apache2/mes-params-ssl.conf ou le nom du fichier copié à l'étape 3)
6. Clé Diffie Hellman
(Note : Si vous souhaitez utiliser les courbes éliptiques Diffie Hellman, vous pouvez sauter cette étape et passer directement à l'étape 7)
Le serveur et le client se mettent d’accord sur un secret commun auquel un tiers ne peut pas avoir accès. C’est l'échange de clé DH La clé DH par défaut fait 2048 bits, nous allons en créer une de 4096 bits
En root, exécuter :
cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096
Puis ajouter dans /etc/apache2/mes-params-ssl.conf ou le nom du fichier copié à l'étape 3
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
7. Elliptic curve Diffie–Hellman (ECDH)
Variante du Protocole DH ci dessus, basé sur des courbes éliptiques, plus sécurisé, plus performant Sur les conseils du créateur de cryptcheck.fr, j’ai utilisé ceci :
SSLOpenSSLConfCmd ECDHParameters prime256v1
SSLOpenSSLConfCmd Curves brainpoolP512r1:secp521r1:brainpoolP384r1:secp384r1:brainpoolP256r1:prime256v1
8. Dernières options de mod_ssl à vérifier
Dans /etc/apache2/mes-params-ssl.conf ou le nom du fichier copié à l'étape 3 :
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
9. Header HSTS
HSTS, pour HTTP Strict Transport Security, sert à forcer le client à n’utiliser que des connexions sécurisées. On ajoute ce header dans le vhost de notre site comme ceci :
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
Le module apache headers est requis pour faire fonctionner cette directive, s’il n’est pas activé, vous pouver l’activer comme ceci :
sudo a2enmod headers && sudo systemctl restart apache2.service
10. Renouvellement du certificat
Les certificats SSL letsencrypt sont valable 3 mois. Cependant la recommandation de l’EFF et de lancer la commande de renouvellement 2 fois par jour (au cas où il y aurait un problème de réponse serveur, que le certificat ne soit pas invalide trop longtemps).
Pour cela, on crée un fichier dans /etc/cron.d
(avec le mode qui va bien, sinon, ce cron ne sera pas exécuté) :
sudo touch /etc/cron.d/letsencrypt
sudo chmod 0644 /etc/cron.d/letsencrypt
Puis on colle dans ce fichier /etc/cron.d/letsencrypt
le contenu suivant :
# letsencrypt auto renewal
# run twice a day as recommended
25 9,7 * * * root /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade
11. Fini !
Normalement, on est au bout. On reload la configuration d’apache (en root) :
systemctl reload apache2.service
Et notre site doit être A+ sur https://cryptcheck.fr