Mise en place d'un certificat SSL

Nous avons précédemment mis en place un serveur Apache2 pour servir les requêtes web de nos utilisateurs, cependant, le http a l'heure actuelle est considéré comme n'étant pas sécurisé. Nous allons donc mettre en place un certificat auto-signé pour chiffrer les communications entre notre serveur et nos client.

Pour commencer, nous allons vérifier que nous avons bien le paquet openssl d'installé et sa version:

openssl version

OpenSSL 1.1.1f 31 Mar 2020

Donc ici, pas de problème openssl est bien disponible, je vais pouvoir générer mes clés SSL !

Nous allons utiliser openssl pour générer nos deux clés, privée, et publique:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/my.key -out /etc/ssl/certs/my.crt

Dans cet exemple, les arguments -keyout représente la clé privée, et le chemin de l'argument -out représente la clé publique Une fois la commande validée, vous allez devoir répondre à certaines question, en l'occurrence, je vais simplement appuyer sur entrée à chaque questions pour garder les paramètres par défaut, étant donne que c'est un simple certificat local que je souhaites mettre en place, dans le cas d'un vrai serveur avec un nom de domaine, il faudrait évidemment mettre en place le bon nom de domaine dans mon certificat.

Nos certificats sont donc crées et disponibles à ces emplacements:

Clé privée: /etc/ssl/private/my.key

Clé publique: /etc/ssl/certs/my.crt

Maintenant que nos clés publiques sont crées, nous allons pouvoir les utiliser dans Apache, pour mettre en place une connexion sécurisée HTTPS.

Mais avant de pouvoir l'utiliser, nous allons avoir besoin d'activer le module SSL d'Apache, pour qu'il soit capable de traiter les clients entrants sur le port ssl/http, a savoir le port 443, pour l'activer, nous allons utiliser la commande:

sudo a2enmod ssl

Cette commande (qui veut dire Apache2 Enable Mod) va activer le module SSL de notre serveur Apache, nous devons ensuite relancer le service Apache pour prendre en compte cette modification avec:

sudo systemctl restart apache2

Cependant, l'activation du module SSL ne sera pas suffisante pour traiter les requêtes https, en effet nous allons devoir mettre en place le VHOST relatif en HTTPS.

Pour ça, nous allons activer le VHOST par défaut pour le https (il est situé dans /etc/apache2/sites-available) avec la commande:

sudo a2ensite default-ssl

Une fois activé, vous devriez retrouver le fichier default-ssl.conf dans /etc/apache2/sites-enabled, nous allons le modifier:

sudo nano /etc/apache2/sites-enabled/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Dans ce fichier, ce qui va m'intéresser, c'est de remplacer les clés SSL par défaut, par celles que nous avons générées plus tôt donc si je reprendre l'emplacement de mes clés cela nous donne:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/my.crt
                SSLCertificateKeyFile /etc/ssl/private/my.key 

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Nous pouvons donc maintenant sauvegarder ce fichier, puis relancer encore une fois le service Apache:

sudo systemctl restart apache2

Et normalement, après redémarrage de votre service apache, vous devriez pouvoir accéder, en https à votre serveur par son ip :)

https://10.0.0.147

2021-01-25_16-16.png

Mais bien entendu, nous allons avoir une alerte du navigateur, attention toutefois, contrairement a ce que dit le navigateur, la connexion entre le client et le serveur est bien chiffrée et sécurisée, cependant, étant donné que ce certificat est auto-signe, il n'est pas reconnu par les navigateurs.

Voilà, vous devriez normalement avoir terminé la mise en place de votre certificat SSL sur votre serveur Web sur Ubuntu ! :)