Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tutoriel:securiser_apache2_avec_ssl [Le 08/07/2011, 19:16] YoBoY léger nettoyage, faudrait reprendre la page |
tutoriel:securiser_apache2_avec_ssl [Le 12/07/2024, 14:40] (Version actuelle) 62.235.195.183 [Utiliser HTTPS avec Apache2] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag>serveur vétuste brouillon}} | + | {{tag>tutoriel serveur apache2 tls ssl}} |
---- | ---- | ||
- | ====== Sécuriser Apache2 avec SSL ====== | + | ====== Utiliser HTTPS avec Apache2 ====== |
- | Ce tutoriel présente une procédure permettant de sécuriser un [[:tutoriel:virtualhosts_avec_apache2|hôte virtuel]] grâce au **protocole SSL**. | + | 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 ===== | ===== Introduction ===== | ||
- | ==== Le protocole SSL ==== | + | ==== Le protocole TLS ==== |
- | SSL est un protocole qui a été développé par la société Netscape. | + | 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. | ||
- | Ce protocole permet à deux machines de communiquer de manière sécurisée. Les informations échangées entre les deux machines sont de ce fait inviolables. | ||
- | |||
- | Le protocole SSL se traduit par la combinaison de deux protocoles bien distincts (//Handshake// et //Record//) qui permettent la négociation entre les deux machines et le chiffrement des données échangées. | ||
- | |||
- | [[http://sebsauvage.net/comprendre/ssl|plus d'informations concernant le fonctionnement du Protocole SSL]] | ||
==== Les Certificats ==== | ==== 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. | + | [[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. |
- | De même, afin de garantir l'authenticité du certificat, ce dernier est signé numériquement par le biais d'une **clé privée** 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é. | + | 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é. |
- | 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 internet comme étant certifié. | + | Un certificat auto-signé n'est pas reconnu comme digne de confiance par les navigateurs web et générera un avertissement. |
- | [[http://www.cacert.org|CA Cert]] permet d'obtenir des certificats gratuits. Il vous faudra néanmoins installer le certificat racine dans votre navigateur. | + | 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. |
- | <note>Dans ce tutoriel, la procédure présentée explique la marche à suivre pour mettre en place un **Site Web sécurisé via protocole SSL en utilisant un Certificat auto-signé**.</note> | + | 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 |
- | + | ||
- | Pour ce tutoriel, nous supposons que nous avons déjà mis en place un [[:tutoriel:virtualhosts_avec_apache2|hôte virtuel]] basé sur le nom nommé **nuxwin.com**, ce dernier étant accessible sur le **port 80** à l'adresse http://nuxwin.com | + | |
===== Mise en application avec le Serveur Http Apache2 ===== | ===== Mise en application avec le Serveur Http Apache2 ===== | ||
- | ==== Activation du module SSL ==== | + | ==== Activation du module SSL/TLS ==== |
- | Pour que le protocole SSL puisse fonctionner avec le Serveur HTTP Apache2, il faut activer le module **ssl** avec la commande : | + | Pour que le protocole TLS puisse fonctionner avec le Serveur HTTP Apache2, il faut activer le module **ssl** avec la commande : |
- | sudo a2enmod ssl | + | <code>sudo a2enmod ssl</code> |
- | puis recharger la configuration d'Apache2 faîtes : | + | |
- | sudo service apache2 force-reload | + | |
- | Ou si vous êtes sur une ancienne version d'Ubuntu : | + | |
- | sudo /etc/init.d/apache2 force-reload | + | |
- | ==== Création du certificat ==== | + | puis recharger la configuration d'Apache2 avec : |
+ | <code>sudo systemctl reload apache2</code> | ||
- | Installer si necessaire le package : apt-get install ssl-cert (déjà installé sous Lucid) | + | Pour vérifier l'activation du module: |
+ | <code>a2query -m ssl</code> | ||
- | Pour générer un certificat auto-signé avec Ubuntu, il nous suffit de taper les commandes suivantes dans un terminal : | + | ==== Création du certificat avec Let's encrypt ==== |
- | * Créer le certificat ssl :<code>sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/localhost.pem</code> | + | |
- | <note important>Suivre ensuite la //méthode 1// pour la //Configuration Apache2//.</note> | + | 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 === | ||
- | === Hardy Héron === | + | Il suffit d'installer le paquet certbot : |
+ | <code> | ||
+ | sudo apt update | ||
+ | sudo apt install certbot</code> | ||
- | On peut créer son certificat SSL auto signé en [[:tutoriel:comment_installer_un_paquet|installant le paquet]] **openssl**. FIXME -> Il est aussi possible d'installer **ca-certificates**, mais ça ne semble pas utile dans le cas d'un certificat auto-signé. | ||
- | Plutôt que de repartir de l'ancien script, je propose de se baser sur [[http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#selfcert|la doc de apache]]. | + | === Générer le certificat avec Certbot === |
- | sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/apache2/server.crt -keyout /etc/apache2/server.key | + | Certbot dispose de très nombreuses options qui sont documentées en anglais [[hhttps://certbot.eff.org/docs/using.html|sur le site officiel]]. |
- | **Explications :** | + | == Méthode n°1 == |
- | * **-x509 -nodes** donne le type de certificat voulu | + | Le script est très bien fait, ce qui implique qu'il est possible de simplement lancer, pour un serveur avec apache: |
- | * **-days 365** indique la durée de validité (en jours) de votre certificat | + | <code bash> |
- | * **-newkey rsa:1024** demande une clé RSA de 1024 bits - d'après la doc apache, il est déconseillé de créer une clé plus grosse pour des histoires de compatibilité | + | sudo certbot --apache |
- | * **-out /etc/apache2/server.crt** est le chemin de votre certificat | + | </code> |
- | * **-keyout /etc/apache2/server.key** est le chemin de la clé privée | + | 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: | ||
- | Répondez alors aux questions posées : | + | <code bash>sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com</code> |
- | Country Name (2 letter code) [GB]: | + | |
- | Entrez **FR** si vous êtes situé en France et validez par la touche « Entrée » | + | |
- | State or Province Name (full name) [Some-State]: | + | |
- | Entrez **FRANCE** et validez par la touche « Entrée » | + | |
- | Locality Name (eg, city) []: | + | |
- | Indiquez ici le nom de votre ville. (//exemple :// **CAEN**) et validez par la touche « Entrée » | + | |
- | Organization Name (eg, company; recommended) []: | + | |
- | Indiquez le nom de votre organisation, de votre société. (//exemple :// **france-hosting**) et validez par la touche « Entrée ». Si vous n'avez pas de société, vous pouvez mettre un nom fictif, le nom de notre site Web par exemple. | + | |
- | Organizational Unit Name (eg, section) []: | + | |
- | Indiquez ici le nom de la section de votre organisation, de votre société. Si vous n'en avez pas, mettez la même chose que pour la question précédente. | + | |
- | Common Name (eg, YOUR name) []: | + | |
- | Ici, il convient de faire particulièrement attention à ce que vous allez entrer. Vous devez indiquer le __nom de domaine__ que vous désirez sécuriser. En ce qui nous concerne, il s'agit du domaine : **nuxwin.com**. Nous indiquons donc **nuxwin.com** et nous validons par la touche « Entrée ». | + | |
- | Email Address []: | + | |
- | Ici, il s'agit d'indiquer l'adresse E-mail de l'administrateur. En ce qui nous concerne, il s'agit de : admin@nuxwin.com. Nous terminons bien entendu en validant par la touche « Entrée ». | + | |
- | Enfin, on empêche les curieux de lire notre clé privée : | + | 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. |
- | sudo chmod 440 /etc/apache2/server.key | + | |
- | <note important>Suivre ensuite la //méthode 2// pour la //Configuration Apache2//.</note> | + | À 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). |
- | ==== Configuration Apache2 ==== | + | 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. | ||
- | === Méthode 1 : en se basant sur la configuration du site par défaut === | + | ==== Configuration de l'hôte virtuel pour HTTPS ==== |
- | * Se placer dans le dossier de configuration des sites apache : <code>cd /etc/apache2/sites-available/</code> | + | <note important>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</note> |
- | * Recopier la configuration par défaut pour la nouvelle configuration ssl :<code>sudo cp default ssl</code> | + | |
- | * Assigner le port ssl :<code>sudo sed -i '1,2s/\*:80/*:443/' ssl</code> | + | |
- | * Ajouter les directives ''SSLEngine On'' et ''SSLCertificateFile /etc/ssl/private/localhost.pem'' à la configuration :<code>sudo sed -i "3a\\\tSSLEngine On\n\tSSLCertificateFile /etc/ssl/private/localhost.pem" ssl</code> | + | |
- | * Activer la configuration du site ssl :<code>sudo a2ensite ssl</code> | + | |
- | === Méthode 2 === | + | [[:tutoriel:comment_editer_un_fichier|Ouvrez le fichier]] de configuration de votre hôte virtuel, par exemple /etc/apache2/sites-available/example.com.conf : |
+ | <code apache> | ||
+ | <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> | ||
+ | </code> | ||
- | == Ajout de la directive Listen 443 == | + | Et ajoutez à la suite l'hôte virtuel pour le port 443 (port standard pour le HTTPS) : |
+ | <code apache> | ||
+ | <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> | ||
- | 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**. | + | # 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" | ||
- | 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. | + | ErrorLog /var/log/apache2/error.example.com.log |
- | + | CustomLog /var/log/apache2/access.example.com.log combined | |
- | Pour ce faire, [[:tutoriel:comment_editer_un_fichier|é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 **nuxwin.com**, un fichier de configuration nommé **nuxwin.com.conf** doit exister dans le répertoire **/etc/apache2/sites-available**. | + | |
- | + | ||
- | Voici le contenu de ce fichier : | + | |
- | <code> | + | |
- | <VirtualHost 192.168.0.2:80> | + | |
- | DocumentRoot /var/www/nuxwin.com | + | |
- | ServerName nuxwin.com | + | |
</VirtualHost> | </VirtualHost> | ||
</code> | </code> | ||
- | **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 : | + | Enregistrez le fichier et rechargez la configuration d'Apache : |
+ | <code> sudo systemctl reload apache2</code> | ||
- | - Directive **SSLEngine** :\\ Cette directive permet d'activer le moteur SSL au sein d'un hôte virtuel, Elle peut prendre deux arguments --> **on/off** | + | Votre site devrait maintenant être accessible en HTTP et en HTTPS. |
- | - 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. | + | === Forcer la connexion en HTTPS === |
- | Nous rajouterons donc cette directive (//NameVirtualHost 192.168.0.2:443//) au début de notre fichier de configuration. | + | 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 : |
- | 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. | + | <code apache> |
+ | <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> | ||
- | Voici donc le contenu de notre fichier une fois modifié : | + | <VirtualHost *:443> |
- | <file> | + | ServerName example.com |
- | NameVirtualHost 192.168.0.2:443 | + | 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> | ||
- | <VirtualHost 192.168.0.2:80> | + | # directives obligatoires pour TLS |
- | ServerName nuxwin.com/ | + | SSLEngine on |
- | Redirect / https://nuxwin.com/ | + | SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem |
- | </VirtualHost> | + | SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem |
+ | |||
+ | Header always set Strict-Transport-Security "max-age=15768000" | ||
- | <VirtualHost 192.168.0.2:443> | + | ErrorLog /var/log/apache2/error.example.com.log |
- | ServerName nuxwin.com | + | CustomLog /var/log/apache2/access.example.com.log combined |
- | DocumentRoot /var/www/nuxwin.com | + | |
- | + | ||
- | SSLEngine on | + | |
- | SSLCertificateFile /etc/apache2/server.crt | + | |
- | SSLCertificateKeyFile /etc/apache2/server.key | + | |
</VirtualHost> | </VirtualHost> | ||
- | </file> | + | </code> |
+ | Enregistrez le fichier et rechargez la configuration d'Apache : | ||
+ | <code> sudo systemctl reload apache2</code> | ||
+ | Votre site devrait maintenant être accessible uniquement en HTTPS. | ||
+ | ==== Renforcer la sécurité ==== | ||
- | ==== Reload du Serveur Http Apache2 ==== | + | 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]] |
- | 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. | + | |
- | + | ||
- | ---- | + | |
- | //Contributeurs : [[utilisateurs:M. DECLERCQ]], [[utilisateurs:_Enchained]], [[utilisateurs:anthony43]], [[utilisateurs:davy014]], [[utilisateurs:Id2ndR]]// | + | --- //[[:utilisateurs:bruno|bruno]]// |