Le but c’est simplement d’avoir un certificat SSL gratuitement donc de passer en HTTPS, et le tout avec Let’s Encrypt sous Apache2.

Tout ce tutoriel est adapté à un serveur sous Debian ( Debian 9 64 bits en particulier ). Si vous avez Windows, à vous de vous adapter. Je pars du principe que vous avez déjà installé Apache2 et PHP. La plupart des commandes sont à effectuer avec un compte ayant les droits root ou en utilisant sudo par exemple.

Maintenant passons à la procédure, déjà pour mettre en place le site web avec une configuration minimale mais efficiente

On va poser quelques bases de départ, et notamment définir par avance des conventions utilisées par la suite :

  • site.fr correspond au nom de domaine, à remplacer par le votre avec le ltd correspondant.
  • xxx.xxx.xxx.xxx correspond à l’adresse IP de votre serveur, elle aussi à remplacer par la votre
  • /dossier/site correspond à la racine où se trouve votre serveur. Par défaut sur Debian, il s’agit de /var/www/html mais moi je préfère me servir du dossier /home pour y stocker mes différents sites.

Je vais partir du principe dès lors que vous n’avez rien et que vous souhaitez tout mettre en place d’abord. Donc il nous faut créer une index juste pour pouvoir vérifier la procédure par la suite.

Ainsi je vous propose de créer le fichier : nano /dossier/site/index.php

Ajoutons ensuite du code tout bête dans ce fichier :

<?php
echo ‘<h1>Hello World !</h1>’;

Ensuite il suffit d’attribuer les droits : chown www-data:www-data /dossier/site/index.php

Passons à la création du fichier de configuration d’Apache2 : nano /etc/apache2/sites-available/site.fr.conf

Le contenu à placer pour avoir une configuration minimale mais sécurisée c’est :

<VirtualHost *:80>
    ServerName catchall
    <Location />
        Order deny,allow
                Allow from xxx.xxx.xxx.xxx
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *:443>
    ServerName catchall
    <Location />
        Order deny,allow
                Allow from xxx.xxx.xxx.xxx
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost site.fr:80>
        ServerAdmin contact@site.fr
        ServerName site.fr
        ServerAlias www.site.fr
        DocumentRoot /dossier/site
        <Directory /dossier/site>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride all
                <IfVersion < 2.3>
                        Order allow,deny
                        allow from all
                </IfVersion>
                <IfVersion >= 2.4>
                        Require all granted
                </IfVersion>
        </Directory>
</VirtualHost>

Je vous conseille de désactiver la signature du serveur pour des raisons de sécurité et pour cela, il suffit de faire : sed -i ‘s;ServerSignature On;ServerSignature Off;g’ /etc/apache2/conf-available/security.conf.

Une fois que cela est fait, vous pouvez dès à présent rendre votre site web visible et publique : cd /etc/apache2/sites-available && a2ensite site.fr.conf && service apache2 reload

Maintenant en allant sur http://site.fr/ ou http://www.site.fr/, vous devriez voir le Hello World sinon c’est que vous n’avez pas tout installé correctement, et je vous renvoie à votre installation, ou alors pas tout remplacer de mes conventions par vos valeurs.


Maintenant passons à la mise en place de notre certificat mais d’abord, il faut activer 2 modules : a2enmod ssl && a2enmod rewrite

Personnellement, je préfère utiliser la version de letsencrypt depuis Github plutôt que depuis les dépôts officiels donc si vous aviez tenté d’installer letsencrypt vous même mais que vous voulez suivre ce tuto alors il vous faut purge la version que vous avez pour éviter les conflits.

Assurez vous d’avoir git ( apt install git ) et ensuite pour la récupération de letsencrypt, c’est simple : git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Pour générer le certificat, il suffit de faire : /opt/letsencrypt/letsencrypt-auto certonly –webroot -w /dossier/site -d site.fr -d www.site.fr

Normalement, il va vous demander lors de la première installation de mettre un mail valide ( des notifications seront envoyées ! ) puis d’accepter leurs conditions d’utilisation et la dernière question est relative à l’EFF mais vous pouvez, pour la dernière, refuser sans conséquence aucune. Vous devriez voir Congrulations à la fin sinon c’est probablement que votre site est injoignable mais bien des causes existent évidemment.

Par la suite, il faut ré-éditer le fichier nano /etc/apache2/sites-available/site.fr.conf pour y ajouter un bloc à la fin ( n’oubliez pas de faire un saut de ligne pour la clarté ) :

<VirtualHost site.fr:443>
        ServerAdmin contact@site.fr
        ServerName site.fr
        ServerAlias www.site.fr
        DocumentRoot /dossier/site
        <Directory /dossier/site>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride all
                <IfVersion < 2.3>
                        Order allow,deny
                        allow from all
                </IfVersion>
                <IfVersion >= 2.4>
                        Require all granted
                </IfVersion>
        </Directory>
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/site.fr/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/site.fr/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

Ensuite, il faut créer le fichier des options donc : nano /etc/letsencrypt/options-ssl-apache.conf et y placer le contenu suivant :

# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

SSLEngine on

# Intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv2 -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
SSLCompression          off

SSLOptions +StrictRequire

# Add vhost name to log entries:
LogFormat “%h %l %u %t \”%r\“ %>s %b \”%{Referer}i\“ \”%{User-agent}i\"" vhost_combined
LogFormat “%v %h %l %u %t \”%r\“ %>s %b” vhost_common

#CustomLog /var/log/apache2/access.log vhost_combined
#LogLevel warn
#ErrorLog /var/log/apache2/error.log

# Always ensure Cookies have “Secure” set (JAH 2012/1)
#Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) “$1; Secure$3$4”

Dès lors, votre site est prêt à l’emploi en faisant simplement : service apache2 reload

Appréciez votre site en HTTPS que ce soit pour https://site.fr/ ou https://www.site.fr/.

Je vous propose toutefois une petite amélioration en forçant le HTTPS. Pour cela, il faut créer un .htaccess dans la racine de votre site et y ajouter quelques règles de redirection : nano /dossier/site/.htaccess puis mettez y :

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>

Options -Indexes

Il reste simplement à donner les droits à ce fichier : chown www-data:www-data /dossier/site/.htaccess et de relancer apache2 : service apache2 reload.

Enjoy !

Bonus : Le renouvellement de letsencrypt n’est pas automatique mais voici comment le rendre automatique. Créez un fichier cron : nano /etc/cron.monthly/letsencrypt_renew et placez y le code suivant :

#!/bin/bash

bash /opt/letsencrypt/letsencrypt-auto renew

exit 0

C’est simple, facile et gratuit alors plus aucune raison de rester en HTTP.

Article Suivant