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édentes Révision précédente
Prochaine révision
Révision précédente
tutoriel:securiser_apache2_avec_ssl [Le 10/03/2018, 12:42]
bruno [Création du certificat avec Let'encrypt]
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>​tutoriel serveur ​vétuste brouillon}}+{{tag>​tutoriel serveur ​apache2 tls ssl}}
  
 ---- ----
  
 ====== Utiliser HTTPS avec Apache2 ====== ====== Utiliser HTTPS avec Apache2 ======
-Ce tutoriel présente une procédure permettant de servir des pages web [[:tutoriel:​virtualhosts_avec_apache2|hôte virtuel]] grâce au **protocole HTTPS**.+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). 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).
  
Ligne 11: Ligne 11:
 ==== Le protocole TLS ==== ==== 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. Les informations échangées entre les deux machines sont de ce fait pratiquement inviolables+Le protocole [[https://​fr.wikipedia.org/​wiki/​Transport_Layer_Security|TLS]] permet à deux machines de communiquer de manière sécurisée.\\ 
-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.+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 ==== ==== 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. ​+[[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 ​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.
  
-[[https://​letsencrypt.org/​|Let'​s encrypt]] permet également d'​obtenir des certificats gratuits. En outre Let'​Encrypt fourni l'​application [[https://​certbot.eff.org/​|cerbot]] qui simplifie grandement la création et la gestion des certificats. Vous avez un excellent tuto pour ubuntu 16.04 [[https://​www.digitalocean.com/​community/​tutorials/​how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04|Ici]] +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 =====
Ligne 35: Ligne 33:
 Pour que le protocole TLS 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 :
 <​code>​sudo a2enmod ssl</​code>​ <​code>​sudo a2enmod ssl</​code>​
-puis recharger la configuration d'​Apache2 ​faites ​:+ 
 +puis recharger la configuration d'​Apache2 ​avec :
 <​code>​sudo systemctl reload apache2</​code>​ <​code>​sudo systemctl reload apache2</​code>​
 Ou si vous êtes sur une ancienne version d'​Ubuntu : Ou si vous êtes sur une ancienne version d'​Ubuntu :
 <​code>​sudo service apache2 reload</​code>​ <​code>​sudo service apache2 reload</​code>​
 +Pour vérifier l'​activation du module:
 +<​code>​apache2ctl -M | grep ssl </​code>​
  
-==== Création du certificat avec Let'​encrypt ====+==== Création du certificat avec Let'encrypt ====
  
-Prérequis :  +Prérequis : 
-  * avoir un nom de domaine pleinement qualifié ​ (nous utiliserons example.com dans la suite);+  * 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.   * avoir un serveur web apache déjà configuré, fonctionnel et accessible publiquement.
  
 === Installation de Certbot === === Installation de Certbot ===
-Les instructions pour installer et utiliser simplement certbot sont disponibles en anglais [[https://​certbot.eff.org/​|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 : +Il suffit ​d'​installer le paquet certbot : 
-<​code>​sudo apt update +<​code>​
-sudo apt install software-properties-common +
-sudo add-apt-repository ppa:​certbot/​certbot+
 sudo apt update sudo apt update
 sudo apt install certbot</​code>​ sudo apt install certbot</​code>​
 +
  
 === Générer le certificat avec Certbot === === 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.]].+Certbot dispose de très nombreuses options qui sont documentées en anglais [[hhttps://​certbot.eff.org/​docs/​using.html|sur le site officiel]].
  
-Voici une des méthode ​les plus simples ​pour générer un certificat en utilisant le greffon « //webroot// » :+== 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:
  
-<​code>​sudo certbot certonly --webroot -w /​var/​www/​example -d example.com -d www.example.com</​code>​+<​code ​bash>sudo certbot certonly --webroot -w /​var/​www/​example -d example.com -d www.example.com</​code>​
  
 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. 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 certificat ​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'​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 : L’emplacement du certificat et de la clé privée est indiqué à la fin de la procédure, typiquement :
Ligne 71: Ligne 78:
    * **/​etc/​letsencrypt/​live/​example.com/​fullchain.pem** pour le certificat complet.    * **/​etc/​letsencrypt/​live/​example.com/​fullchain.pem** pour le certificat complet.
  
-=== Configuration de l'​hôte virtuel pour HTTPS ===+==== Configuration de l'​hôte virtuel pour HTTPS ====
  
-[[:​tutoriel:​comment_editer_un_fichier|Ouvrez le fichier]] de configuration de votre hôte virtuel, par exemple /etc/aapche2/​sites-available/​example.com.conf :+<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>​ 
 + 
 +[[:​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> <code apache>
 <​VirtualHost *:80> <​VirtualHost *:80>
-    ServerName ​www.domain.tld +    ServerName ​example.com 
-    ServerAlias ​domain.tld +    ServerAlias ​www.example.com 
-    ServerAdmin webmaster@domain.tld +    ServerAdmin webmaster@example.com 
-    DocumentRoot /srv/web/domain.tld/www +    DocumentRoot /srv/web/example.com/www 
- <​Directory /srv/web/domain.tld/www>+ <​Directory /srv/web/example.com/www>
  Options -Indexes +FollowSymLinks +MultiViews  Options -Indexes +FollowSymLinks +MultiViews
  AllowOverride none  AllowOverride none
  Require all granted  Require all granted
  </​Directory>​  </​Directory>​
- ErrorLog /​var/​log/​apache2/​error.domain.tld.log + ErrorLog /​var/​log/​apache2/​error.example.com.log 
- CustomLog /​var/​log/​apache2/​access.domain.tld.log combined+ CustomLog /​var/​log/​apache2/​access.example.com.log combined
 </​VirtualHost>​ </​VirtualHost>​
 </​code>​ </​code>​
Ligne 93: Ligne 102:
 <code apache> <code apache>
 <​VirtualHost *:443> <​VirtualHost *:443>
-    ServerName ​www.domain.tld +    ServerName ​example.com 
-    ServerAlias ​domain.tld +    ServerAlias ​www.example.com 
-    ServerAdmin webmaster@domain.tld +    ServerAdmin webmaster@example.com 
-    DocumentRoot /srv/web/domain.tld/www +    DocumentRoot /srv/web/example.com/www 
- <​Directory /srv/web/domain.tld/www>+ <​Directory /srv/web/example.com/www>
  Options -Indexes +FollowSymLinks +MultiViews  Options -Indexes +FollowSymLinks +MultiViews
  AllowOverride none  AllowOverride none
Ligne 110: Ligne 119:
  Header always set Strict-Transport-Security "​max-age=15768000"​  Header always set Strict-Transport-Security "​max-age=15768000"​
  
- ErrorLog /​var/​log/​apache2/​error.domain.tld.log + ErrorLog /​var/​log/​apache2/​error.example.com.log 
- CustomLog /​var/​log/​apache2/​access.domain.tld.log combined+ CustomLog /​var/​log/​apache2/​access.example.com.log combined
 </​VirtualHost>​ </​VirtualHost>​
 </​code>​ </​code>​
-==== Configuration Apache2 ==== 
  
-=== Méthode 1 : en se basant sur la configuration ​du site par défaut ===+Enregistrez le fichier et rechargez ​la configuration ​d'​Apache : 
 +<​code>​ sudo systemctl reload apache2</​code>​
  
-  * Se placer dans le dossier de configuration des sites apache : <​code>​cd /​etc/​apache2/​sites-available/</​code>​ +Votre site devrait maintenant être accessible en HTTP et en HTTPS.
-  * 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 ===+=== 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 :
  
-== Ajout de la directive Listen 443 ==+<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>​
  
-Par défaut, Apache2 est configuré pour écouter sur le port 80Il s'agit là de la configuration usuelle d'un Serveur WebCependant, le protocole SSL a besoin d'un port spécifique pour pouvoir fonctionnerIl s'agit du **port 443**.+<​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>​
  
-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.+       # 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"​
  
-Pour ce faire, [[:​tutoriel:​comment_editer_un_fichier|éditez le fichier]] **/etc/apache2/ports.conf** et rajoutez la ligne suivante : + ErrorLog ​/var/log/apache2/error.example.com.log 
-  Listen 443 + CustomLog ​/var/log/apache2/access.example.com.log combined
- +
-== Création du fichier de configuration == +
- +
-Ayant déjà configuré notre hôte virtuel **site1.com**, un fichier de configuration nommé **site1.com.conf** doit exister dans le répertoire **/etc/apache2/sites-available**. +
- +
-Voici le contenu de ce fichier :  +
-<​code>​ +
-<​VirtualHost 192.168.1.250:​80>​ +
- DocumentRoot /​var/​www/​site1.com +
- ServerName site1.com+
 </​VirtualHost>​ </​VirtualHost>​
 </​code>​ </​code>​
-**Note :** Il s'agit ici du contenu minimal d'un virtualhost. +Enregistrez le fichier et rechargez ​la configuration d'Apache ​
- +<codesudo systemctl reload ​apache2</​code>
-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 : +
- +
-  - Directive **SSLEngine** :\\ Cette directive permet d'​activer le moteur SSL au sein d'un hôte virtuel, Elle peut prendre deux arguments --> **on/​off** +
-  - 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. +
-Nous rajouterons donc cette directive (//​NameVirtualHost 192.168.1.250:​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é ​+
-<file> +
-NameVirtualHost 192.168.0.2:​443 +
- +
-<​VirtualHost 192.168.1.250:​80>​ +
-    ServerName site1.com/​ +
-    Redirect / https://​site1.com/​ +
-</​VirtualHost>​ +
- +
-<​VirtualHost 192.168.1.250:​443>​ +
- ServerName nuxwin.com +
- DocumentRoot /​var/​www/​site1.com +
- +
- SSLEngine on +
- SSLCertificateFile /etc/apache2/​server.crt +
- SSLCertificateKeyFile /​etc/​apache2/​server.key +
-</VirtualHost> +
-</​file>​ +
- +
- +
-==== 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==== +
-**(fr)** [[https://​lafibre.info/​cryptographie/​tuto-https/​|Ubuntu 14.04 : Tutoriel pour chiffrer un site web gratuitement en 14 étapes simples]]+
  
-**(fr)** [[http://​www.it-connect.fr/​configurer-le-ssl-avec-apache-2%ef%bb%bf/​|Configurer le SSL avec Apache 2]] sur IT-Connect+Votre site devrait maintenant être accessible uniquement en HTTPS. 
 +==== Renforcer la sécurité ====
  
-**(fr)** ​[[http://www.magdiblog.fr/divers/​creer-une-passerelle-securisee-avec-un-raspberry-pi/|Exemple complet avec authentification client par certificat]]+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.1520682145.txt.gz
  • Dernière modification: Le 10/03/2018, 12:42
  • par bruno