Différences

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

Lien vers cette vue comparative

Prochaine révision
Révision précédente
tutoriel:securiser_apache2_avec_ssl [Le 20/03/2014, 13:55]
46.218.46.150 [Les Certificats]
tutoriel:securiser_apache2_avec_ssl [Le 12/09/2023, 18:54] (Version actuelle)
78.196.241.242 [Création du certificat avec Let's encrypt] simplification installation
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 web 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 **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 TLS puisse fonctionner avec le Serveur HTTP Apache2, il faut activer le module **ssl** avec la commande : 
 +<​code>​sudo a2enmod ssl</​code>​
  
-Pour que le protocole SSL puisse fonctionner avec le Serveur HTTP Apache2, il faut activer le module **ssl** avec la commande : +puis recharger la configuration d'​Apache2 ​avec 
-  sudo a2enmod ssl +<​code>​sudo systemctl reload ​apache2</​code>​
-puis recharger la configuration d'​Apache2 ​faites ​+
-  sudo service ​apache2 ​force-reload+
 Ou si vous êtes sur une ancienne version d'​Ubuntu : Ou si vous êtes sur une ancienne version d'​Ubuntu :
-  ​sudo /etc/init.d/​apache2 force-reload+<​code>​sudo service apache2 reload</code> 
 +Pour vérifier l'​activation du module: 
 +<​code>​apache2ctl -M | grep ssl </code>
  
-==== Création du certificat ====+==== Création du certificat ​avec Let's encrypt ​====
  
-Installer si necessaire le package ​apt-get install ssl-cert ​ (déjà installé sous Lucid)+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.
  
-Pour générer un certificat auto-signé avec Ubuntu, il nous suffit de taper les commandes suivantes dans un terminal : +=== Installation ​de Certbot ===
-  * Créer le certificat ssl :<​code>​sudo make-ssl-cert /​usr/​share/​ssl-cert/​ssleay.cnf /​etc/​ssl/​private/​localhost.pem</​code>​ +
-  * Pour un certificat d'​autorité gratuit ​=> [[http://​startssl.com|StartSSL]] ( Ne provoque pas d'​exception ​de sécurité sur le navigateur ) +
-  * troisième option : suivre ce [[tutoriel:​comment_creer_un_certificat_ssl|tutoriel]]+
  
-<note important>Suivre ensuite la //méthode 1// pour la //​Configuration Apache2//.</note>+Il suffit d'​installer le paquet certbot : 
 +<code> 
 +sudo apt update 
 +sudo apt install certbot</code>
  
  
-=== Hardy Heron ===+=== 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]].
  
-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é.+== 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:
  
-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 documentation de apache]]. +<code bash>sudo certbot certonly ​--webroot ​-/var/www/example -d example.com -d www.example.com<​/code>
-  ​sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/apache2/server.crt -keyout ​/etc/​apache2/​server.key+
  
-**Explications :** +Cette commande va générer un certificat ​valable pour les domaines ​(option ​-d) example.com et www.example.comqui correspondent à un site web existant et fonctionnel placé dans le dossier racine (option ​-w) var/www/example.
-  * **-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 apacheil 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'​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évocationSeront crées également une tâche cron (/etc/cron.d./certbot) et un timer systemd ​(lib/systemd/system/certbot.timerpermettant ​de renouveler automatiquement les certificats avant qu'​ils ​n'arrivent à échéance (les certificats Let'​sEncrypt ne sont valables ​que 3 mois).
-  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 : +L’emplacement du certificat et de la clé privée ​est indiqué à la fin de la procédure, typiquement ​
-  sudo chmod o-rw /etc/apache2/server.key+   * **/etc/letsencrypt/live/​example.com/​privkey.pem** pour la clé privée 
 +   * **/​etc/​letsencrypt/​live/​example.com/​fullchain.pem** pour le certificat complet.
  
-<note important>​Suivre ensuite la //méthode 2// pour la //Configuration ​Apache2//​.</​note>​+==== Configuration ​de l'​hôte virtuel pour HTTPS ====
  
-==== Configuration Apache2 ====+<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>​
  
-=== Méthode 1 en se basant sur la configuration ​du site par défaut ===+[[: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>​
  
-  * Se placer dans le dossier de configuration des sites apache ​<​code>​cd /​etc/​apache2/​sites-available/</​code>​ +Et ajoutez à la suite l'​hôte virtuel pour le port 443 (port standard pour le HTTPS) ​
-  * Recopier la configuration par défaut pour la nouvelle configuration ssl :<code>sudo cp default ssl</​code+<​code ​apache
-  * Assigner le port ssl :<code>​sudo sed -i '​1,​2s/​\*:​80/​*:443/' ssl</​code+<VirtualHost ​*:443> 
-  * 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+    ​ServerName example.com 
-  * Activer la configuration du site ssl :<​code>​sudo a2ensite ssl</code>+    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>
  
-=== Méthode 2 ===+       # 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"​
  
-== Ajout de la directive Listen 443 == + ErrorLog ​/var/log/apache2/error.example.com.log 
- + CustomLog ​/var/log/apache2/access.example.com.log combined
-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, [[:​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 automatiquementmodifiez 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>
-==== 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====+Votre site devrait maintenant être accessible uniquement en HTTPS. 
 +==== Renforcer la sécurité ​====
  
-**(fr)** ​[[http://www.it-connect.fr/configurer-le-ssl-avec-apache-2%ef%bb%bf/|Configurer le SSL avec Apache 2]] sur IT-Connect+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:M. DECLERCQ]], [[utilisateurs:​_Enchained]],​ [[utilisateurs:​anthony43]],​ [[utilisateurs:​davy014]],​ [[utilisateurs:​Id2ndR]]//+--- //​[[:​utilisateurs:​bruno|bruno]]//
  • tutoriel/securiser_apache2_avec_ssl.1395320143.txt.gz
  • Dernière modification: Le 20/03/2014, 13:55
  • par 46.218.46.150