Ceci est une ancienne révision du document !
Utiliser HTTPS avec Apache2
Ce tutoriel présente une procédure permettant de servir des pages web hôte virtuel grâce au protocole HTTPS. Avec HTTPS, les échanges HTTP entre le client et le serveur sont chiffrés (et donc sécurisés) via le protocole TLS (ou autrefois SSL).
Introduction
Le protocole TLS
Le protocole https://fr.wikipedia.org/wiki/Transport_Layer_Security|TLS permet à deux machines de communiquer de manière sécurisée. Les informations échangées entre les deux machines sont de ce fait pratiquement inviolables. Il doit assurer l'authentification du serveur grâce à un certificat. La confidentialité des données grâce au chiffrement et l’intégrité des données.
Les Certificats
Un certificat permet de fournir diverses informations concernant l'identité de son détenteur (la personne qui publie les données). Ce certificat s'accompagne d'une clé publique qui est indispensable pour que la communication entre les machines soit chiffrée.
Afin de garantir l'authenticité du certificat, ce dernier est signé numériquement provenant soit d'un organisme officiel (Société spécialisée dans la certification) soit par le détenteur du Certificat lui même. Dans ce dernier cas, on parlera de certificat auto-signé.
Dans la plupart des cas, l'obtention d'un Certificat certifié par une autorité officielle ayant un prix assez élevé, les webmasters auront tendance a vouloir signer eux-même leur certificat. Ce faisant, il est à noter que dans ce cas, le certificat ne sera pas reconnu par les navigateurs web comme étant certifié.
CA Cert permet d'obtenir des certificats gratuits. Il vous faudra néanmoins installer le certificat racine dans votre navigateur.
Let's encrypt permet également d'obtenir des certificats gratuits. En outre Let'Encrypt fourni l'application cerbot qui simplifie grandement la création et la gestion des certificats. Vous avez un excellent tuto pour ubuntu 16.04 Ici
Pour ce tutoriel, nous supposons que nous avons déjà mis en place un hôte virtuel basé sur le nom nuxwin.com, ce dernier étant accessible sur le port 80 à l'adresse http://nuxwin.com
Mise en application avec le Serveur Http Apache2
Activation du module SSL/TLS
Pour que le protocole TLS puisse fonctionner avec le Serveur HTTP Apache2, il faut activer le module ssl avec la commande :
sudo a2enmod ssl
puis recharger la configuration d'Apache2 faites :
sudo systemctl reload apache2
Ou si vous êtes sur une ancienne version d'Ubuntu :
sudo service apache2 reload
Création du certificat avec Let'encrypt
Prérequis :
- avoir un nom de domaine pleinement qualifié (nous utiliserons example.com dans la suite);
- avoir un serveur web apache déjà configuré, fonctionnel et accessible publiquement.
Installation de Certbot
Les instructions pour installer et utiliser simplement certbot sont disponibles en anglais sur le site officiel.
En voici, un récapitulatif. Il faut d'abord installer le depôt ppa officiel (sans risques) puis installer le paquet certbot :
sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt update sudo apt install certbot
Générer le certificat avec Certbot
Certbot dispose de très nombreuses options qui sont documentées en anglais sur le site officiel..
Voici une des méthode les plus simples pour générer un certificat en utilisant le greffon « webroot » :
sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
Cette commande va générer un certificat valable pour les domaines (option -d) example.com et www.example.com, qui correspondent à un site web existant et fonctionnel placé dans le dossier racine (option -w) var/www/example.
À l'issue de la commande précédente sera crée une arborescence sous /etc/letsencrypt qui contient vos certificat et des fichiers de configuration nécessaires aux procédures de renouvellement et de révocation. Sera crée également une tâche crom (/etc/cron.d./certbot) permettant de renouveler automatiquement les certificats avant qu'ils n'arrivent à échéance (les certificats Let'sEncrypt ne sont valables que 3 mois).
L’emplacement du certificat et de la clé privée est indiqué à la fin de la procédure, typiquement :
- /etc/letsencrypt/live/example.com/privkey.pem pour la clé privée
- /etc/letsencrypt/live/example.com/fullchain.pem pour le certificat complet.
Configuration de l'hôte virtuel pour HTTPS
Configuration Apache2
Méthode 1 : en se basant sur la configuration du site par défaut
- Se placer dans le dossier de configuration des sites apache :
cd /etc/apache2/sites-available/
- Recopier la configuration par défaut pour la nouvelle configuration ssl :
sudo cp default ssl
- Assigner le port ssl :
sudo sed -i '1,2s/\*:80/*:443/' ssl
- Ajouter les directives
SSLEngine On
etSSLCertificateFile /etc/ssl/private/localhost.pem
à la configuration :sudo sed -i "3a\\\tSSLEngine On\n\tSSLCertificateFile /etc/ssl/private/localhost.pem" ssl
- Activer la configuration du site ssl :
sudo a2ensite ssl
Méthode 2
Ajout de la directive Listen 443
Par défaut, Apache2 est configuré pour écouter sur le port 80. Il s'agit là de la configuration usuelle d'un Serveur Web. Cependant, le protocole SSL a besoin d'un port spécifique pour pouvoir fonctionner. Il s'agit du port 443.
Nous allons donc rajouter une directive de configuration nommée Listen qui permettra d'indiquer à Apache2 qu'il doit aussi écouter sur le port 443.
Pour ce faire, éditez le fichier /etc/apache2/ports.conf et rajoutez la ligne suivante :
Listen 443
Création du fichier de configuration
Ayant déjà configuré notre hôte virtuel site1.com, un fichier de configuration nommé site1.com.conf doit exister dans le répertoire /etc/apache2/sites-available.
Voici le contenu de ce fichier :
<VirtualHost 192.168.1.250:80> DocumentRoot /var/www/site1.com ServerName site1.com </VirtualHost>
Note : Il s'agit ici du contenu minimal d'un virtualhost.
Pour sécuriser cet Hôte Virtuel, nous allons donc devoir modifier ce fichier en y ajoutant un hôte virtuel accessible sur le port 443, ce dernier contenant des directives particulières qui sont les suivantes :
- Directive SSLEngine :
Cette directive permet d'activer le moteur SSL au sein d'un hôte virtuel, Elle peut prendre deux arguments –> on/off - Directive SSLCertificateFile :
Cette directive définit le certificat authentifiant le Serveur auprès des clients. L'argument est le chemin d'accès au certificat. En ce qui nous concerne, le certificat se trouve dans le répertoire /etc/apache2/ - Directive SSLCertificateKeyFile :
Cette directive définit la clé privée du Serveur utilisée pour signer l'échange de clé entre le client et le serveur. Elle prend en argument le chemin d'accès à la clé (fichier). Dans notre cas, la clé se trouve dans le répertoire /etc/apache2/.
Par ailleurs, comme nous l'avons déjà fait pour notre hôte virtuel accessible sur le port 80, nous allons devoir rajouter une directive NameVirtualHost qui permettra que l'adresse nommée par le nom de notre hôte virtuel accessible sur le port 443 soit résolue correctement. Nous rajouterons donc cette directive (NameVirtualHost 192.168.1.250:443) au début de notre fichier de configuration.
Enfin, afin que les clients puissent continuer d'accéder au site Web en tapant une url de type http et non https, nous allons modifier l'hôte virtuel accessible sur le port 80 en remplaçant la directive DocumentRoot par une directive de redirection.
Voici donc le contenu de notre fichier une fois modifié :
NameVirtualHost 192.168.0.2:443 <VirtualHost 192.168.1.250:80> ServerName site1.com/ Redirect / https://site1.com/ </VirtualHost> <VirtualHost 192.168.1.250:443> ServerName nuxwin.com DocumentRoot /var/www/site1.com SSLEngine on SSLCertificateFile /etc/apache2/server.crt SSLCertificateKeyFile /etc/apache2/server.key </VirtualHost>
Relance du serveur HTTP Apache2
Afin que les modifications que nous venons d'effectuer soient prises en compte, nous devons demander au Serveur Http Apache2 de relire ses fichiers de configuration.
Pour ce faire, il suffit de taper la commande suivante dans un terminal :
sudo /etc/init.d/apache2 reload
Normalement, si tout s'est bien passé, vous devriez désormais avoir accès à votre site Web de manière sécurisée.
Voir aussi
(fr) Ubuntu 14.04 : Tutoriel pour chiffrer un site web gratuitement en 14 étapes simples
(fr) Configurer le SSL avec Apache 2 sur IT-Connect
(fr) Exemple complet avec authentification client par certificat
Contributeurs : M. DECLERCQ, _Enchained, anthony43, davy014, Id2ndR