Si vous avez plusieurs serveurs serveurs web sur un votre réseau local et que vous souhaitez que plusieurs d'entre eux soient accessibles depuis internet par le même port (au hasard 80 ou 443 par exemple), il est fort probable que vous fassiez appel à un reverse-proxy, qui est un moyen somme toute assez commode pour y parvenir.
De même si vous souhaitez chiffrer le contenu publié en SSL/TLS, certbot est devenu ces dernières années un incontournable, de par sa simplicité et sa gratuité.
Faire que les deux fonctionnent nécessite bien sûr une configuration particulaire, voici donc comment procéder dans le cas ou vous avez créé un sous-domaine (A record) chez votre fournisseur de noms de domaine :
- le nom du sous domaine sera : sous.domaine.com
- l'adresse ip du serveur sur le réseau local : 192.168.1.123
- l'adresse ip du serveur web dans la DMZ : 192.168.1.210
- le port de l'application sur le serveur web local : 9000
- la racine des fichiers du serveur web local : /racine/des/fichiers/de/mon/serveurweb (généralement sous ubuntu ou debian : /var/www ou /var/www/html etc.)
Du côté de la machine qui va servir de proxy inverse (reverse proxy) accessible par internet (en DMZ) :
Créer un nouveau fichier de configuration pour apache :
touch /etc/apache2/sites-available/mon-reverse-proxy1.conf
nano /etc/apache2/sites-available/mon-reverse-proxy1.conf
Et y ajouter :
# Si ce n'est déjà fait (peu probable par défaut...)
# NameVirtualHost *:80
# Listen 80
# NameVirtualHost *:443
# Listen 443
# Surtout :
# Nécessaire pour la validation du certificat électronique
<VirtualHost *:80>
ServerName nom.de.sous.domaine
ServerAdmin mon.adresse@e.mail
<LocationMatch "/*">
order allow,deny
allow from all
Satisfy any
ProxyPass http://192.168.1.123
ProxyPassReverse http://192.168.1.123
</LocationMatch>
</virtualHost>
<VirtualHost *:443>
ServerName nom.de.sous.domaine
ServerAdmin mon.adresse@e.mail
ProxyRequests Off
ProxyPreserveHost On
SSLEngine on
SSLProxyEngine On
SSLProxyCheckPeerExpire On
SSLProxyVerifyDepth 10
SSLCertificateFile /etc/letsencrypt/live/videos.espitallier.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/videos.espitallier.net/privkey.pem
<LocationMatch "/*">
order allow,deny
allow from all
Satisfy any
ProxyPass http://192.168.1.123:9000
ProxyPassReverse http://192.168.1.123:9000
</LocationMatch>
</virtualHost>
Enregistrer le fichier puis :
sudo a2ensite mon-reverse-proxy1
sudo service apache2 restart
Du côté du serveur web de l'application (192.168.1.123) pour créer le certificat :
# Si certbot n'est pas encore installé :
# sudo apt install certbot # dans le cas de debian ou ubuntu par exemple
# ensuite
sudo certbot certonly
Répondre aux questions :
- 2: Place files in webroot directory (webroot)
- Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): sous.domaine.com
- Input the webroot for sous.domaine.com: (Enter 'c' to cancel): /racine/des/fichiers/de/mon/serveurweb
Automatiser le renouvellement du certificat
Création du script
sudo nano /usr/local/sbin/certbot-renew.sh
Auquel on ajoute
sudo certbot -q renew
# Par clé SSH et à supposer que le dossier 192.168.1.210:/etc/letsencrypt/live/sous.domaine.com/ a été créé
sudo scp /etc/letsencrypt/live/sous.domaine.com/fullchain.pem sudouser@192.168.1.210:/etc/letsencrypt/live/sous.domaine.com/
sudo scp /etc/letsencrypt/live/sous.domaine.com/privkey.pem sudouser@192.168.1.210:/etc/letsencrypt/live/sous.domaine.com/
On le rend exécutable
chmod +x /usr/local/sbin/certbot-renew.sh
Autoriser la copie par SSH sans mot de passe
ssh-keygen -t rsa
cat .ssh/id_rsa.pub | ssh root@192.168.1.100 'cat >> .ssh/authorized_keys'
Planification du script
sudo crontab -e
# Une fois par mois
00 5 * 1 * /usr/local/sbin/certbot-renew.sh