{{tag>tutoriel serveur apache2 tls ssl}}
----
====== Utiliser HTTPS avec Apache2 ======
Ce tutoriel présente une procédure permettant de servir des pages web [[:apache2#creation_d_hotes_virtuels|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.\\
Il assure authentification du serveur, le chiffrement des données en transit et le contrôle de leur intégrité. Les informations échangées entre les deux machines sont de ce fait pratiquement inviolables.
==== Les Certificats ====
[[https://fr.wikipedia.org/wiki/Certificat_%C3%A9lectronique|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 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é.
Un certificat auto-signé n'est pas reconnu comme digne de confiance par les navigateurs web et générera un avertissement.
Les autorités de certification font payer leur service. Cependant[[https://letsencrypt.org/|Let's encrypt]] permet maintenat d'obtenir des certificats gratuits. En outre Let's Encrypt fournit l'application [[https://certbot.eff.org/|cerbot]] qui simplifie grandement la création et la gestion des certificats.
Pour ce tutoriel, nous supposons que nous avons déjà mis en place un [[:apache2#creation_d_hotes_virtuels|hôte virtuel]] basé sur le nom **example.com**, ce dernier étant accessible sur le **port 80** à l'adresse http://example.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 avec :
sudo systemctl reload apache2
Pour vérifier l'activation du module:
a2query -m ssl
==== Création du certificat avec Let's encrypt ====
Prérequis :
* avoir un nom de domaine pleinement qualifié acheté auprès d'un bureau d’enregistrement (nous utiliserons example.com dans la suite) ;
* avoir un enregistrement DNS mettant en correspondance le nom de domaine et l'adresse IP publique du serveur ;
* avoir un serveur web apache déjà configuré, fonctionnel et accessible publiquement.
=== Installation de Certbot ===
Il suffit d'installer le paquet certbot :
sudo apt update
sudo apt install certbot
Il peut être nécessaire aussi d'installer((src:https://stackoverflow.com/questions/68641213/issue-with-certbot-to-generate-a-ssl-certificate)) sudo apt install python3-certbot-apache
=== Générer le certificat avec Certbot ===
Certbot dispose de très nombreuses options qui sont documentées en anglais [[hhttps://certbot.eff.org/docs/using.html|sur le site officiel]].
== Méthode n°1 ==
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…
== Méthode n°2 ==
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. Seront crées également une tâche cron (/etc/cron.d./certbot) et un timer systemd (lib/systemd/system/certbot.timer) 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 ====
Uniquement si vous avez utilisé la méthode n°2 pour obtenir le certificat. Avec la méthode n°1 les fichiers sont générés automatiquement
[[:tutoriel:comment_editer_un_fichier|Ouvrez le fichier]] de configuration de votre hôte virtuel, par exemple /etc/apache2/sites-available/example.com.conf :
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /srv/web/example.com/www
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride none
Require all granted
ErrorLog /var/log/apache2/error.example.com.log
CustomLog /var/log/apache2/access.example.com.log combined
Et ajoutez à la suite l'hôte virtuel pour le port 443 (port standard pour le HTTPS) :
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /srv/web/example.com/www
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride none
Require all granted
# 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
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 :
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
# Redirection 301 vers le site en HTTPS
Redirect permanent / https://example.com/
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /srv/web/example.com/www
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride none
Require all granted
# 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
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 [[https://mozilla.github.io/server-side-tls/ssl-config-generator/|générateur de configuration de Mozilla]]
--- //[[:utilisateurs:bruno|bruno]]//