(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