Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
tutoriel:securiser_apache2_avec_ssl [Le 06/06/2007, 12:02] – commande inutile micheldtutoriel:securiser_apache2_avec_ssl [Le 13/11/2024, 16:09] (Version actuelle) – [Création du certificat avec Let's encrypt] install python3-certbot-apache bcag2
Ligne 1: Ligne 1:
-{{tag>feisty serveur brouillon}}+{{tag>tutoriel serveur apache2 tls ssl}}
  
-====== Sécuriser Apache2 avec SSL ====== +----
-Ce tutoriel présente une procédure permettant de sécuriser un [[:tutoriel:virtualhosts_avec_apache2|hôte virtuel]] grâce au **protocole SSL**.+
  
-===== Le protocole 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).
  
-SSL est un protocole qui a été développé par la société Netscape. +===== Introduction =====
  
-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 TLS ====
  
-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.+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.
  
-[[http://sebsauvage.net/comprendre/ssl|plus d'informations concernant le fonctionnement du Protocole SSL]] 
  
-===== Mise en application avec le Serveur Http Apache2 =====+==== Les Certificats ====
  
-==== Activation du module SSL ==== +[[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.
-Pour que le protocole SSL 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 +
-  sudo /etc/init.d/apache2 force-reload+
  
 +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 ====
  
-==== Les Certificats ==== +Pour que le protocole TLS puisse fonctionner avec le Serveur HTTP Apache2, il faut activer le module **ssl** avec la commande : 
-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.+<code>sudo a2enmod ssl</code>
  
-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é.+puis recharger la configuration d'Apache2 avec : 
 +<code>sudo systemctl reload apache2</code>
  
-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 signé 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é.+Pour vérifier l'activation du module: 
 +<code>a2query -m ssl</code>
  
->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é**.+==== Création du certificat avec Let's encrypt ====
  
-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+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.
  
-=== Avant Feisty Fawn ===+=== Installation de Certbot ===
  
-FIXME tester si la procédure pour feisty fonctionne sous Edgy et Dapper. Si oui, supprimer cette partie.\\ +Il suffit d'installer le paquet certbot 
-Pour générer un certificat auto-signé avec Ubuntu, il nous suffit de taper les commandes suivantes dans un terminal : +<code bash
-**1.** On se place dans le répertoire dans lequel le certificat doit être généré +sudo apt update 
-<code> +sudo apt install certbot</code> 
-cd /etc/apache2/ssl +<note tip>Il peut être nécessaire aussi d'installer((src:https://stackoverflow.com/questions/68641213/issue-with-certbot-to-generate-a-ssl-certificate)) <code bash>sudo apt install python3-certbot-apache</code> </note>
-</code> +
-**2.** On lance la commande de génération : +
-<code> +
-sudo apache2-ssl-certificate +
-</code> +
-(Note: par défaut, apache2-ssl-certificate génère un certificat valable 1 mois. Il est possible d'utiliser le paramètre -days pour modifier la durée de validité. Par exemple: **sudo apache2-ssl-certificate -days 365** génèrera un certificat valable 1 an.)+
  
-=== Sous Feisty Fawn ===+=== 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]].
  
-La commande apache2-ssl-certificate n'existe plus sous Feisty (cf le bug suivant [[https://launchpad.net/ubuntu/+source/apache2/+bug/77675]]). En fait, le "problème" existe déjà en amont, chez Debian. Il semble donc que ce script a été abandonné.+== 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: 
 +<code bash> 
 +sudo certbot --apache 
 +</code> 
 +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:
  
-On peut cependant 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é.+<code bash>sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com</code>
  
-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]]. +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 openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/apache2/server.crt -keyout /etc/apache2/server.key+
  
-**Explications :** +À 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).
-  * **-x509 -nodes** donne le type de certificat voulu +
-  * **-days 365** indique la durée de validité (en jours) de votre certificat +
-  * **-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é +
-  * **-out /etc/apache2/server.crt** est le chemin de votre certificat +
-  * **-keyout /etc/apache2/server.key** est le chemin de la clé privée+
  
-Répondez alors aux questions posées : +L’emplacement du certificat et de la clé privée est indiqué à la fin de la procédure, typiquement 
-  Country Name (2 letter code) [GB]: +   * **/etc/letsencrypt/live/example.com/privkey.pem** pour la clé privée 
-Entrez **FR** si vous êtes situé en France et validez par la touche « Entrée » +   * **/etc/letsencrypt/live/example.com/fullchain.pem** pour le certificat complet.
-  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 : +==== Configuration de l'hôte virtuel pour HTTPS ====
-  sudo chmod 440 /etc/apache2/server.key+
  
 +<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>
  
-==== Ajout de la directive Listen 443 ==== +[[: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> 
-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**. +<VirtualHost *:80> 
- +    ServerName example.com 
-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. +    ServerAlias www.example.com 
- +    ServerAdmin webmaster@example.com 
-Pour ce faire, [[:tutoriel:comment_editer_un_fichier|éditez le fichier]] **/etc/apache2/ports.conf** et rajoutez la ligne suivante +    DocumentRoot /srv/web/example.com/www 
-  Listen 443 + <Directory /srv/web/example.com/www> 
- + Options -Indexes +FollowSymLinks +MultiViews 
-Puis rechargez la configuration du serveur (FIXME pourquoi recharger maintenant puisqu'on n'a pas fini ?) : + AllowOverride none 
-  sudo /etc/init.d/apache2 reload+ Require all granted 
 + </Directory> 
 + ErrorLog /var/log/apache2/error.example.com.log 
 + CustomLog /var/log/apache2/access.example.com.log combined 
 +</VirtualHost> 
 +</code>
  
-==== Création du fichier de configuration ====+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>
  
-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**.+       # 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"
  
-Voici le contenu de ce fichier :  + ErrorLog /var/log/apache2/error.example.com.log 
-<code> + CustomLog /var/log/apache2/access.example.com.log combined
-<VirtualHost 192.198.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>
  
-**1.** Directive **SSLEngine** :+Votre site devrait maintenant être accessible en HTTP et en HTTPS.
  
-Cette directive permet d'activer le moteur SSL au sein d'un hôte virtuel, Elle peut prendre deux arguments --> **on/off**+=== 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 :
  
-**2.** Directive **SSLCertificateFile** :+<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>
  
-Cette directive définit le certificat authentifiant le Serveur auprès des clientsL'argument est le chemin d'accès au certificatEn ce qui nous concerne, le certificat se trouve dans le répertoire **/etc/apache2/ssl**+<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>
  
-**3.** Directive **SSLCertificateKeyFile** :+       # 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"
  
-<del>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 même fichier que le certificat. Elle se trouve donc dans le répertoire **/etc/apache2/ssl**. + ErrorLog /var/log/apache2/error.example.com.log 
- + CustomLog /var/log/apache2/access.example.com.log combined
-Toutefois, il convient de noter que le chemin ne sera pas directement celui du fichier. En effet, il s'agira d'un  lien symbolique de la forme **f9b34192.0** se trouvant lui aussi dans le répertoire **/etc/apache2/ssl**.</del> +
- +
-Il est découragé, mais on peut se passer de SSLCertificateKeyFile (cf : http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslcertificatekeyfile) car la clef et le certificat sont tous les deux contenus dans notre apache2.pem +
- +
-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.0.2: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é : +
-<code> +
-NameVirtualHost 192.168.0.2:443 +
- +
-<VirtualHost 192.168.0.2:80> +
-    ServerName nuxwin.com +
-    Redirect / https://nuxwin.com +
-</VirtualHost> +
- +
-<VirtualHost 192.168.0.2:443> +
- ServerName nuxwin.com +
- DocumentRoot /var/www/nuxwin.com +
- +
- SSLEngine on +
- SSLCertificateFile /etc/apache2/apache2.pem +
- <del>SSLCertificateKeyFile /etc/apache2/ssl/<nom du fichier.key></del>+
 </VirtualHost> </VirtualHost>
 </code> </code>
-<del>**Ps :** //<nom du fichier.key>// doit être remplacé par le nom du lien symbolique de la forme  **f9b34192.0**. Je rappelle que ce lien symbolique se situe dans le répertoire **/etc/apache2/ssl**.</del> +Enregistrez le fichier et rechargez la configuration d'Apache : 
-==== Reload du Serveur Http Apache2 ==== +<codesudo systemctl reload apache2</code>
-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 : +Votre site devrait maintenant être accessible uniquement en HTTPS
-  sudo /etc/init.d/apache2 reload +==== Renforcer la sécurité ====
-Normalement, si tout s'est bien passé, vous devriez désormais avoir accès à votre site Web de manière sécurisée.+
  
-----+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]]
  
-//Contributeurs : [[utilisateurs:_Enchained]], [[utilisateurs:anthony43]]//+--- //[[:utilisateurs:bruno|bruno]]//