Skip to main content

Apache2 - Configuration HTTPS

image.pngimage.png

Difficulté : Intermédiaire


Notions : Chiffrement, Certificats, HTTPS



I. Introduction

Afin de sécuriser les flux vers le serveur web et garantir l'authenticité de la communication avec le partenaire, il est nécessaire de passer à la version sécurisée du protocole HTTP. Qui est le HTTPS.

Cette procédure vise à mettre en place la configuration nécessaire sur le serveur apache2.

Prérequis : Un serveur apache2 doit être installé et fonctionnel.


II. Génération des certificats

2.1 Cas du certificat auto-signé

Attention: cette méthode chiffre les communications mais ne garantit pas forcément l'identité du serveur. En effet, pour que cela soit le cas, il faudra faire signer sa requête par une autorité de certification reconnue.

Créer dans le répertoire "/etc/apache2/ " un répertoire "certificates".

mkdir /etc/apache2/certificates && cd /etc/apache2/certificates

image.pngimage.png

Avec openssl, il va falloir faire 3 choses :

  • Créer une clé privée.
openssl genrsa -out private.key 2048

ici, 2048 est la longueur de la clé de chiffrement. private.key est le nom du fichier.

image.pngimage.png

Bonne pratique : Il est préférable de protéger la clé avec un chiffrement. Ainsi, un mot de passe sera demandé lors de toute lecture de la clé. Pour cela ajouter l'opérande '-aes-256' après genrsa lors de la génération.

  • Générer une requête (demande de certificat) signée par la clé privée.
openssl req -new -key private.key -out server.csr

ici, private.key est le nom du fichier de la clé avec laquelle la demande sera signée. server.csr est le nom du fichier de la requête.

Il va falloir alors répondre à quelques questions :

image.pngimage.png

Le champ challenge password sert à protéger le csr contre l'altération. Il sera en effet demandé lors de la modification ou la révocation de celle-ci. il est optionnel.

On a donc le csr suivant :

image.pngimage.png

  • Signer la requête pour générer le certificat.
openssl x509 -req -days 365 -in server.csr -signkey private.key -out certificate.crt

ici, x509 est le format du certificat voulu.

365 est le nombre de jour de validité de certificat (celui-ci expirera dans 365 jours et devra être renouvelé).

-in : la demande que l'on souhaite signer

-signkey : la clé qui servira à signer la demande

- out : le fichier de sortie --> le certificat.

image.pngimage.png

On a donc le certificat suivant :

image.pngimage.png

Astuce : il est possible de réaliser les trois actions ci-dessus en une seule commande.

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -sha256 -out /etc/apache2/certificates/certificate.crt -keyout /etc/apache2/certificates/private.key

2.2 Cas du certificat signé par une CA

Pour garantir l'authenticité de la communication, il est nécessaire de faire valider le certificat par une autorité tierce.

Info : par exemple Let's Encrypt

Il faudra alors effectuer les deux premières étapes, à savoir :

  • Génération de la clé privée
  • Génération de la requête (csr)

Mais au lieu de la signer, le csr sera envoyé à la CA, qui s'assurera d'abord de la légitimité de la requête et nous renverra le certificat signé.

Il faudra alors le déposer dans le dossier des certificats précédemment créé.


III. Configuration apache 2

Bonne pratique : Il est préférable à ce stade de sécuriser l’accès à la clé privée en limitant son accès. En effet, si un pirate récupère la clé, il pourra lui-même générer un certificat pour usurper l'identité du serveur.

chown -r root:www-data /etc/apache2/certificates
chmod 440 /etc/apache2/certificates/private.key

3.1 Activation des modules

Activer le module apache pour le HTTPS.

a2enmod ssl

image.pngimage.png

Redémarrer apache2.

service apache2 restart

image.pngimage.png

3.2 Configuration apache

Aller dans : "/etc/apache2/sites-available/" et éditer le fichier de configuration SSL "default-ssl.conf".

Modifier les deux lignes suivantes pour qu'elles reflètent la configuration voulue.

image.pngimage.png

Enregistrer et quitter.

Activer le site avec la commande :

a2ensite default-ssl.conf

image.pngimage.png

Recharger le service apache2 pour appliquer toutes les configurations de sites.

service apache2 reload

Le site est désormais accessible en https :

image.pngimage.png

Info : l'erreur de confidentialité viens du fait que le certificat est auto-signé.

Si l'on affiche le certificat :

image.pngimage.png

Facultatif - optimisation de sécurité

Ajouter également dans le fichier "default-ssl.conf" les lignes suivantes pour corriger les failles du protocole SSL :

SSLProtocol -ALL +TLSv1 +TLSv1.1 +TLSv1.2
SSLHonorCipherOrder On
SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:!MD5:!aNULL:!EDH:!RC4
SSLCompression off


IV. Redirection HTTP vers HTTPS

Pour terminer la configuration, trois solutions sont possibles.

  1. Laisser tel quel et offrir la possibilité de choisir entre le http et le https.
  2. Couper le service http si l'on ne l'estime plus nécessaire.
  3. Rediriger l'utilisateur vers le https automatiquement si il tente une connexion en http.

Dans le premiers cas rien de plus n'est à faire. Sinon :

Désativer HTTP

Désactiver le site HTTP par défaut :

a2dissite 000-default.conf

 

Couper le port d'écoute 80 en éditant le fichier "/etc/apache2/ports.conf" et en commentant la ligne suivante :

image.pngimage.png

 

Sauvegarder, quitter.

Puis relancer le service apache.

service apache2 restart

 

Le serveur web n'écoute plus les communications sur le port 80.

image.pngimage.png

Rediriger HTTP --> HTTPS

Activer le module url rewriting (celui-ci permet au serveur de réécrire les url).

a2enmod rewrite

image.pngimage.png

 

Désactiver le site HTTP par défaut :

a2dissite 000-default.conf

 

Remplacer le fichier "000-default.conf" par un autre fichier appelé par exemple "default-http.conf"

cd /etc/apache2/sites-available/
mv 000-default.conf 000-default.conf.bkp && touch default-http.conf

 

Editer le fichier créé "default-http.conf" et écrire ce qui suit :

<VirtualHost *:80>
ServerName ste-lab-dmi01.mfrstegreve.fr
ServerAlias ste-lab-dmi01.mfrstegreve.fr

RewriteEngine On

Redirect permanent / https://ste-lab-dmi01.mfrstegreve.fr?

</VirtualHost>