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).

Le protocole TLS

Le protocole 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 par une autorité de certification (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 AC (autorité de certification) ayant un prix assez élevé, les webmasters auront tendance à 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 fournit 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 example.com, ce dernier étant accessible sur le port 80 à l'adresse http://example.com

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

Pour vérifier l'activation du module:

apache2ctl -M | grep ssl 

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 dépô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.

Le script est très bien fait, ce qui implique qu'il est possible de simplement lancer, pour un serveur avec apache:

sudo certbot --apache

Le script se déroule et pose des questions, à commencer par les domaine à passer en https, puis si on veut rediriger http vers https…

Une autre méthode également simple pour générer un certificat en utilisant le greffon « webroot » est:

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 certificats et des fichiers de configuration nécessaires aux procédures de renouvellement et de révocation. Sera crée également une tâche cron (/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

Ouvrez le fichier de configuration de votre hôte virtuel, par exemple /etc/apache2/sites-available/example.com.conf :

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /srv/web/example.com/www
	<Directory /srv/web/example.com/www>
		Options -Indexes +FollowSymLinks +MultiViews
		AllowOverride none
		Require all granted
	</Directory>
	ErrorLog /var/log/apache2/error.example.com.log
	CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>

Et ajoutez à la suite l'hôte virtuel pour le port 443 (port standard pour le HTTPS) :

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /srv/web/example.com/www
	<Directory /srv/web/example.com/www>
		Options -Indexes +FollowSymLinks +MultiViews
		AllowOverride none
		Require all granted
	</Directory>
 
       # directives obligatoires pour TLS
      	SSLEngine on
	SSLCertificateFile    /etc/letsencrypt/live/example.com/fullchain.pem
	SSLCertificateKeyFile   /etc/letsencrypt/live/example.com/privkey.pem
 
	Header always set Strict-Transport-Security "max-age=15768000"
 
	ErrorLog /var/log/apache2/error.example.com.log
	CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>

Enregistrez le fichier et rechargez la configuration d'Apache :

 sudo systemctl reload apache2

Votre site devrait maintenant être accessible en HTTP et en HTTPS.

Forcer la connexion en HTTPS

Si vous voulez que votre site ne soit accessible qu'en HTTPS et que les internautes soient redirigés automatiquement, modifiez ainsi votre fichier d'hôte virtuel :

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    # Redirection 301  vers le site en HTTPS
    Redirect permanent / https://example.com/
</VirtualHost>
 
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /srv/web/example.com/www
	<Directory /srv/web/example.com/www>
		Options -Indexes +FollowSymLinks +MultiViews
		AllowOverride none
		Require all granted
	</Directory>
 
       # directives obligatoires pour TLS
      	SSLEngine on
	SSLCertificateFile    /etc/letsencrypt/live/example.com/fullchain.pem
	SSLCertificateKeyFile   /etc/letsencrypt/live/example.com/privkey.pem
 
	Header always set Strict-Transport-Security "max-age=15768000"
 
	ErrorLog /var/log/apache2/error.example.com.log
	CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>

Enregistrez le fichier et rechargez la configuration d'Apache :

 sudo systemctl reload apache2

Votre site devrait maintenant être accessible uniquement en HTTPS.

Renforcer la sécurité

Si vous voulez optimiser la sécurité des échanges en HTTPS, le plus simple est d'utiliser le générateur de configuration de Mozilla

bruno

  • tutoriel/securiser_apache2_avec_ssl.txt
  • Dernière modification: Le 30/10/2019, 10:25
  • (modification externe)