LINUX:HTTP - Paramétrage des machines virtuelles, port HTTPS
But
En second lieu, on va paramétrer les diverses machines virtuelles pour le port HTTPS, c'est à dire le n° 443.
Organisation
Nous allons créer un fichier de paramétrage par machine virtuelle et par adresse IP.
Ces fichiers seront placés dans un nouveau répertoire que l'on nommera "/etc/httpd/conf.hosts-ssl.d".
Pour qu'ils soient intégrés dans la configuration d'Apache, on ajoute à la suite du fichier "/etc/httpd/conf/httpd.conf", la ligne suivante:
Include /etc/httpd/conf.hosts-ssl.d/*.conf
Ainsi si on ajoute ou retire une machine virtuelle, il suffit de créer ou détruire le fichier correspondant à notre machine virtuelle et ensuite de recharger la configuration d'Apache.
Machines virtuelles publiques
Pour toutes ces machines, c'est l'utilitaire "cerbot" qui va récupérer leurs certificats. Voyez l'article sur Let's Encrypt: certificats gratuits SSL/TLS.
Nous allons prendre un premier cas, la machine virtuelle "www.adbweb.gslb.eu". Voici le contenu du fichier qu'on pourrait nommer "host-www-gslb-ssl.conf":
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName www.adbweb.gslb.eu Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/www.adbweb.gslb.eu/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/www.adbweb.gslb.eu/privkey.pem Include conf.public.d/*.conf </VirtualHost> </IfModule>
On remarque les paramètres suivants:
- <VirtualHost *:443> : début de la section "VirtualHost" qui concerne toute adresse IP pour le port 443 (HTTPS).
- ServerName : définit le nom de la machine virtuelle concernée.
- Include /etc/letsencrypt/options-ssl-apache.conf : on inclut le fichier généré par l'utilitaire "cerbot" qui reprend les paramètres SSL.
- SSLCertificateFile : on ajoute la chaine de certificats de cette machine
- SSLCertificateKeyFile : on ajoute la chaine des clés liés à cette machine
- Include conf.public.d/*.conf : on inclut les paramètres de configuration des différents sites accessibles à partir de cette machine. Ces inclusions peuvent être multiples ou spécifiques selon votre organisation.
- </VirtualHost> : clôture de la section "VirtualHost".
Toutes les autres machines suivront ce même schéma.
Voici les autres sur le même schéma pour les différentes autres machines virtuelles:
- la machine virtuelle "adbweb.gslb.eu" (fichier "host-gslb-ssl.conf")
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName adbweb.gslb.eu Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/adbweb.gslb.eu/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/adbweb.gslb.eu/privkey.pem Include conf.public.d/*.conf </VirtualHost> </IfModule>
- la machine virtuelle "archive.laplanchedenvol.be" (fichier "host-abeille-ssl.conf")
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName archive.laplanchedenvol.be Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/archive.laplanchedenvol.be/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/archive.laplanchedenvol.be/privkey.pem Include conf.abeille.d/*.conf </VirtualHost> </IfModule>
- la machine virtuelle "laplanchedenvol.be" (fichier "host-asbl-ssl.conf")
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName laplanchedenvol.be Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/laplanchedenvol.be/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/laplanchedenvol.be/privkey.pem Include conf.asbl.d/*.conf </VirtualHost> </IfModule>
Machine "localhost"
On aborde la machine "localhost" de façon un peut différente car elle n'est utilisée que via l'adresse IP "127.0.0.1":
On nommera ce fichier "host-localhost-ssl.conf" dont voici le contenu:
<IfModule mod_ssl.c> <VirtualHost 127.0.0.1:443> ServerName localhost ServerAlias 127.0.0.1 SSLEngine on SSLOptions +StrictRequire SSLCertificateFile /etc/pki/home/certs/externe.crt SSLCertificateKeyFile /etc/pki/home/private/localhost.key SSLCACertificateFile /etc/pki/home/certs/ca.externe.crt <if " %{HTTP_HOST} == '127.0.0.1' " > # RewriteEngine on # RewriteRule ^ https://localhost%{REQUEST_URI} [END,NE,R=permanent] Redirect permanent "/" "https://localhost/" </if> Include conf.local.d/*.conf </VirtualHost> </IfModule>
Quelques paramètres:
- SSLEngine on : on active le mécanisme de cryptage SSL
- SSLCertificateFile, SSLCertificateKeyFile et SSLCACertificateFile : on ajoute les certificats privés décrits dans l'article sur les certificats de l'Extension de la CA privée (V3): certificat de la machine, la clé et le certificat de la CA.
- <if ... > : bloc IF qui permet de traiter séparément le cas où la requête se fait via l'adresse IP du "localhost". (variable spéciale "HTTP_HOST") (https://127.0.0.1/...)
- Redirect : la requête est redirigée vers la machine "localhost" en HTTPS; notons qu'on aurait pu utiliser les options "RewriteEngine" et "RewriteRule" comme utilisé avec le protocole HTTP.
- </if> : clôture du bloc IF
Machines virtuelles locales
Sur le même modèle, cette configuration concerne notre machine locale "serverdb.home.dom" et ses alias "serverdb" et "www.home.dom" (fichier "host-serverdb-ssl.conf"):
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName serverdb.home.dom ServerAlias serverdb www.home.dom SSLEngine on SSLOptions +StrictRequire SSLCertificateFile /etc/pki/home/certs/home.crt SSLCertificateKeyFile /etc/pki/home/private/localhost.key SSLCACertificateFile /etc/pki/home/certs/ca.home.crt Include conf.local.d/*.conf </VirtualHost> </IfModule>
Adresse IP vers le LAN privé
Toute adressage IP public est transformé dans notre LAN privé selon l'adresse IP privée de notre serveur "192.168.1.100".
Nous la traitons aussi comme une machine virtuelle séparée (fichier "host-ip-ssl.conf"). Nous allons traiter la requête différemment si la requête vient de notre LAN privé ou d'Internet:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName 192.168.1.100 # <if " %{REMOTE_ADDR} == '192.168.1.2' " > <If "-R '192.168.1.0/24'"> Redirect permanent "/" "https://serverdb.home.dom/" </if> SSLEngine on SSLOptions +StrictRequire SSLCertificateFile /etc/pki/home/certs/home.crt SSLCertificateKeyFile /etc/pki/home/private/localhost.key SSLCACertificateFile /etc/pki/home/certs/ca.home.crt Include conf.ip.d/*.conf </VirtualHost> </IfModule>
Le bloc IF "<If "-R '192.168.1.0/24'">" détecte si le client qui envoie la requête appartient au réseau LAN privé "192.168.1.0/24". Dans ce cas, la requête est redirigée vers l'URL: https://serverdb.home.dom/
On aurait pu faire un bloc IF ("<if " %{REMOTE_ADDR} == '192.168.1.2' " >") qui ne concerne qu'un client spécifique ayant l'adresse IP "192.168.1.2".
Dans les autres cas, on utilise un site spécial qui va interdire d'utiliser des requêtes via l'adresse IP.
Voici le contenu du fichier "/etc/httpd/conf.ip.d/root.conf":
DocumentRoot "/web/ip" <Directory /web/ip> Require all denied </Directory>
Affichage des machines virtuelles du port HTTPS
Quand la configuration complète sera faite, on peut exécuter la commande suivante:
httpd -D DUMP_VHOSTS
qui donnera pour cette partie:
VirtualHost configuration: 127.0.0.1:443 localhost (/etc/httpd/conf.hosts-ssl.d/host-localhost-ssl.conf:2) *:443 is a NameVirtualHost default server archive.laplanchedenvol.be (/etc/httpd/conf.hosts-ssl.d/host-abeille-ssl.conf:2) port 443 namevhost archive.laplanchedenvol.be (/etc/httpd/conf.hosts-ssl.d/host-abeille-ssl.conf:2) port 443 namevhost laplanchedenvol.be (/etc/httpd/conf.hosts-ssl.d/host-asbl-ssl.conf:2) port 443 namevhost adbweb.gslb.eu (/etc/httpd/conf.hosts-ssl.d/host-gslb-ssl.conf:2) port 443 namevhost 192.168.1.100 (/etc/httpd/conf.hosts-ssl.d/host-ip-ssl.conf:2) port 443 namevhost serverdb.home.dom (/etc/httpd/conf.hosts-ssl.d/host-serverdb-ssl.conf:2) alias serverdb alias www.home.dom port 443 namevhost www.adbweb.gslb.eu (/etc/httpd/conf.hosts-ssl.d/host-www-gslb-ssl.conf:2)
On remarque en quatrième ligne, la configuration par défaut. Elle est celle de la machine virtuelle "archive.laplanchedenvol.be". Cette configuration est prise par défaut car elle est la première rencontrée selon l'ordre alphabétique des fichiers de paramétrage. Dans le cas d'une requête HTTP pour une machine virtuelle non listée, c'est le défaut qui sera pris en compte. Si on veut en mettre une autre, il suffit de changer le nom du fichier. Par exemple, on le fait précéder de "00-". Cette pratique a déjà été rencontrée pour le paramétrage des modules.
On remarque également la mise à part de la machine "localhost" suite à la restriction à une adresse IP particulière.
Autre remarque, la "machine" "192.168.1.100" n'en est pas réellement une et les certificats utilisés seront ceux du défaut, la machine "archive.laplanchedenvol.be". Dans ce cas, il n'y a pas adéquation entre la liste des "machines" du certificat et l'adresse IP de cette "machine". L'explorateur Internet tel Firefox refusera d'aller plus loin sauf en ajoutant une exception.
Si on veut résoudre, il faut mettre cette "machine" "192.168.1.100" en première position pour qu'elle devienne le défaut avec ses certificats. On renomme le fichier "host-ip-ssl.conf" en "00-host-ip-ssl.conf".
En exécutant à nouveau la commande:
httpd -D DUMP_VHOSTS
on obtiendra:
VirtualHost configuration: 127.0.0.1:443 localhost (/etc/httpd/conf.hosts-ssl.d/host-localhost-ssl.conf:2) *:443 is a NameVirtualHost default server 192.168.1.100 (/etc/httpd/conf.hosts-ssl.d/00-host-ip-ssl.conf:2) port 443 namevhost 192.168.1.100 (/etc/httpd/conf.hosts-ssl.d/00-host-ip-ssl.conf:2) port 443 namevhost archive.laplanchedenvol.be (/etc/httpd/conf.hosts-ssl.d/host-abeille-ssl.conf:2) port 443 namevhost laplanchedenvol.be (/etc/httpd/conf.hosts-ssl.d/host-asbl-ssl.conf:2) port 443 namevhost adbweb.gslb.eu (/etc/httpd/conf.hosts-ssl.d/host-gslb-ssl.conf:2) port 443 namevhost serverdb.home.dom (/etc/httpd/conf.hosts-ssl.d/host-serverdb-ssl.conf:2) alias serverdb alias www.home.dom port 443 namevhost www.adbweb.gslb.eu (/etc/httpd/conf.hosts-ssl.d/host-www-gslb-ssl.conf:2)
Mais dans ce cas, les informations du certificat privé vont être visibles du monde entier, notamment le nom privé et l'adresse IP privée de notre serveur.
Par cette seconde solution, vous n'aurez plus d'erreur due aux certificats en local.
On peut tester ces configurations en ligne de commande sous Linux avec les utilitaires "curl" et "wget".