Reverse Proxy HTTPS vers HTTPS

Installation du serveur Apache

Installer Apapche2

Activer les modules que vous souhaitez et surtout mod_reverse

Listes des modules actifs
access_compat.load  authz_core.load  deflate.load  http2.load         mpm_event.load       proxy.conf          proxy_http2.load     rewrite.load        ssl.load
alias.conf          authz_host.load  dir.conf      log_debug.load     negotiation.conf     proxy_connect.load  proxy_http.load      setenvif.conf       status.conf
alias.load          authz_user.load  dir.load      log_forensic.load  negotiation.load     proxy_ftp.conf      proxy.load           setenvif.load       status.load
auth_basic.load     autoindex.conf   env.load      mime.conf          proxy_ajp.load       proxy_ftp.load      proxy_wstunnel.load  slotmem_shm.load    xml2enc.load
authn_core.load     autoindex.load   filter.load   mime.load          proxy_balancer.conf  proxy_html.conf     reqtimeout.conf      socache_shmcb.load
authn_file.load     deflate.conf     headers.load  mpm_event.conf     proxy_balancer.load  proxy_html.load     reqtimeout.load      ssl.conf

Paramétrage Apache

Paramétrage global

Configurer votre 1er Vhost

Exemple de Vhost http
################# Exemple Vhost #################

<VirtualHost *:80>
        ServerName exemple.fr

        DocumentRoot    /var/www/exemple.fr

TransferLog /var/log/apache2/exemple.fr_access.log
ErrorLog /var/log/apache2/exemple.fr_error.log

</VirtualHost>
Créer le dossier du vhost
mkdir /var/www/exemple.fr

chown www-data:www-data /var/www/exemple.fr

Normalement votre site est accessible à votre adresse “exemple.fr”

Pensez à faire pointer vos DNS au bon endroit et à faire les règles de par-feu (port 80 entrant vers port 80 de votre IP-serveurWEB)

Voila là ça doit marcher !

Paramétrage du SSL via ACME

Je passe les commandes d’installation de ACME accessible ICI.

Générez votre certificat SSL

acme.sh --issue -d exemple.fr -w /var/www/exemple.fr/

Paramétrage du reverse proxy

Activer Module proxy de apache commande : a2enmod "lemodule"

Modifier votre vhost en ajoutant la partie SSL et reverse
<IfModule mod_ssl.c>
        <VirtualHost *:443>

        ServerName exemple.fr

        SSLEngine on
        SSLStrictSNIVHostCheck Off
                SSLCertificateFile      /root/.acme.sh/exemple.fr/exemple.fr.cer
                SSLCertificateKeyFile   /root/.acme.sh/exemple.fr/exemple.fr.key
                SSLCertificateChainFile /root/.acme.sh/exemple.fr/ca.cer
                SSLCACertificateFile    /root/.acme.sh/exemple.fr/fullchain.cer

        SSLProxyEngine On
        SSLProxyCheckPeerCN Off
        SSLProxyCheckPeerName Off
        SSLProxyVerify none
        ProxyPreserveHost On
        ProxyPass / https://exemple.local/
        ProxyPassReverse / https://exemple.local/

        TransferLog /var/log/apache2/exemple.fr-ssl_access.log
        ErrorLog /var/log/apache2/exemple.fr-ssl_error.log

        </VirtualHost>
</IfModule>

Quelques explications sur les directives.

Tout d’abord la partie serveur https

  • VirtualHost *:443 : précise que l’on écoute sur le port 443 (https)
  • ServerName : le nom de domaine du serveur (FQDN)
  • DocumentRoot : c’est juste pour information, car tout le trafic sera redirigé (d’ailleurs on ne met pas de directive Directory)
  • SSLEngineOn, SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile, SSLCACertificateFile : paramétrage du SSL, avec le certificat et la clé

Viennent ensuite les directives relatives à la partie Reverse proxy :

  • SSLProxyEngine : activation du mode Proxy en SSL
  • SSLProxyCheckPeerCN et SSLProxyCheckPeerName : permet de ne pas vérifier le CN et le nom du serveur distant
  • SSLProxyVerify : pas de vérification du serveur distant
  • SSLProxyMachineCertificateFile : concaténation de la clé et du certificat de la machine (pas nécessaire si on désactive les vérifications)
  • ProxyPass et ProxyPassReverse : il s’agit du paramétrage “standard” du mode reverse proxy
  • ProxyPreserverHost On : garde le nom DNS du reverse proxy (sinon on récupère l’adresse IP du serveur cible)

On test et redémarre apache :

apachectl -t
service apache2 reload

On vérifie que le serveur apache s’est lancé :

root@reverse:~# systemctl status apache2.service
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-08-22 19:25:21 CEST; 2 weeks 0 days ago
  Process: 16647 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
 Main PID: 9935 (apache2)
    Tasks: 129 (limit: 4915)
   CGroup: /system.slice/apache2.service
           ├─ 9935 /usr/sbin/apache2 -k start
           ├─16653 /usr/sbin/apache2 -k start
           └─16718 /usr/sbin/apache2 -k start

sept. 06 16:51:11 reverse systemd[1]: Reloading The Apache HTTP Server.
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.831280 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module authn_core_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.831860 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module authz_core_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.832190 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module proxy_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.832507 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module proxy_http_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.832822 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module proxy_wstunnel_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.833171 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module headers_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.833551 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module setenvif_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.833873 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module ssl_module is already loaded, skipping
sept. 06 16:51:11 reverse systemd[1]: Reloaded The Apache HTTP Server.
Enfin vous pouvez ajouter une directive pour forcer la redirection entre http et https en entrant
 RewriteEngine On
 RewriteCond %{HTTPS} off
 RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

En cas de souci, les commandes systemctl status et journalctl -xe permettent de débugguer les erreurs.

J’ai notamment eu un cas où le service ne voulait pas démarrer car le ServerName n’était pas renseigné dans le fichier de configuration global.

Mon vhost complet
################# exemple.fr #################

<VirtualHost *:80>
        ServerName 	exemple.fr

        DocumentRoot    /var/www/exemple.fr

        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

TransferLog /var/log/apache2/exemple.fr_access.log
ErrorLog /var/log/apache2/exemple.fr_error.log

</VirtualHost>
<IfModule mod_ssl.c>
        <VirtualHost *:443>

        ServerName exemple.fr

        SSLEngine on
        SSLStrictSNIVHostCheck Off
                SSLCertificateFile      /root/.acme.sh/exemple.fr/exemple.fr.cer
                SSLCertificateKeyFile   /root/.acme.sh/exemple.fr/exemple.fr.key
                SSLCertificateChainFile /root/.acme.sh/exemple.fr/ca.cer
                SSLCACertificateFile    /root/.acme.sh/exemple.fr/fullchain.cer

        SSLProxyEngine On
        SSLProxyCheckPeerCN Off
        SSLProxyCheckPeerName Off
        SSLProxyVerify none
        ProxyPreserveHost On
        ProxyPass / https://exemple.local/
        ProxyPassReverse / https://exemple.local/

        TransferLog /var/log/apache2/exemple.fr-ssl_access.log
        ErrorLog /var/log/apache2/exemple.fr-ssl_error.log

        </VirtualHost>
</IfModule>

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *