mod_ssl et certificats
Lorsqu'une connexion est initié tous les paquets passent en clair sur le réseau. Une personne peut alors capturer les paquets grâce à des logiciels comme Wireshark et étudier le trafic. Lorsque l'échange ne concerne que des simples demandes de pages web cela n'est pas grave mais lors de la connexion à une interface administrateur via login et mot de passe cela peut être problématique. En effet, la personne mal intentionnée pourra trouver sans trop de difficultés les identifiants utilisés.
Pour sécuriser les actions sensibles faites au travers de HTTP, il existe une technique consistant à utiliser une version chiffrée du protocole : HTTPS. Ce dernier exploite TLS (anciennement nommé SSL) pour sécuriser les échanges.
Pour utiliser HTTPS, il faut installer le mod_ssl de Apache :
aptitude install libapache2-mod-ssl
Il faut ensuite modifier le fichier /etc/apache2/ports.conf pour que le serveur puisse écouter sur le port 443. On y ajoutera ceci :
<IfModule mod_ssl.c> Listen 443 </IfModule>
Puis on active le module SSL :
a2enmod ssl
Dans Debian, Apache et son module SSL sont livrés avec un certificat TLS de base mais qui n'est pas reconnu par les navigateurs. Afin de ne pas avoir à faire à l'avertissement que les navigateurs affichent si le certificat n'est pas reconnu, il faut faire générer ce dernier par une autorité de certification reconnue. Malheureusement, ceci est souvent payant mais une entreprise propose des certificat de classe 1 gratuitement : StartCom. La procédure de demande d'un certificat est relativement simple et rapide à suivre, il faut toutefois penser à stocker le certificat en lieu sûr après sa récupération.
Une fois le certificat obtenu, il faut configurer le ou les virtual hosts pour qu'ils l'utilisent. On commence donc par créer un répertoire ssl dans /etc/apache2/ et on y met tous les fichiers nécessaires à l'utilisation du certificat.
mkdir /etc/apache2/ssl
Enfin, on modifie le ou les virtual hosts en ajoutant ces quelques lignes :
SSLEngine On SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW SSLCertificateFile /etc/apache2/ssl/mon_certificat.crt SSLCertificateKeyFile /etc/apache2/ssl/mon_certificat.key SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem SSLCACertificateFile /etc/apache2/ssl/ca.pem
Si l'on utilise le mod_macro, on peut facilement se faire une macro pour se simplifier la vie.
<Macro SSL $cert> SSLEngine On SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW SSLCertificateFile /etc/apache2/ssl/$cert.crt SSLCertificateKeyFile /etc/apache2/ssl/$cert.key SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem SSLCACertificateFile /etc/apache2/ssl/ca.pem </Macro>
Lors du redémarrage de Apache un mot de passe est demandé. Ce mot de passe correspond à celui donné lors de la génération du certificat SSL. Si l'on souhaite ne pas devoir rentrer ce mot de passe à chaque fois, il est possible de déchiffrer le fichier clé du certificat.
cd /etc/apache2/ssl openssl rsa -in mon_certificat.key -out mon_certificat.key
Après un nouveau redémarrage de Apache, on doit pouvoir utiliser le protocole HTTPS pour naviguer sur le site protégé.
Note : Il se peut que le navigateur n'affiche pas l'indicateur de certificat. Ceci est souvent dû à l'utilisation de contenu extérieur au site et non-sécurisé. Il faut alors par exemple avoir une copie locale du contenu ou le récupérer également via HTTPS si le site extérieur le propose.