Soit un proxy web avec Apache httpd qui transfert les requêtes des client⋅e⋅s à un serveur Tomcat. Le proxy force le client à revenir lui causer en HTTPS, mais transfert les requêtes en HTTP, c'est-à-dire en clair, au Tomcat (car ce sont deux machines virtuelles sur le même hyperviseur donc le risque est quasi nul et que configurer Tomcat, pour mettre en œuvre HTTPS ou autre chose, c'est une plaie donc no way).
Problème : si l'application exécutée par le Tomcat envoie une redirection HTTP, elle code le protocole, http, en dur dans la réponse. Apache httpd transfert ça au client… qui demande la bonne ressource au proxy… en clair. Ainsi l'HTTPS initial est détourné : n'importe qui sur Internet, entre le client et le proxy, voit les ressources qui sont demandées. Pas le contenu, certes, mais l'URL précise tout de même… C'est préoccupant d'un point de vue vie privée.
Pour s'en rendre compte, on utilise wget
:
$ wget https://lala.example.net
--2017-09-05 11:51:37-- https://lala.example.net/
Résolution de lala.example.net (lala.example.net)… 192.0.2.1
Connexion à lala.example.net (lala.example.net)|192.0.2.1|:443… connecté.
requête HTTP transmise, en attente de la réponse… 302
Emplacement : http://lala.example.net/mon_appli/index.html [suivant]
--2017-09-05 11:51:39-- http://lala.example.net/mon_appli/index.html
Connexion à lala.example.net (lala.example.net)|192.0.2.1|:80… connecté.
requête HTTP transmise, en attente de la réponse… 302 Found
Emplacement : https://lala.example.net/mon_appli/index.html [suivant]
--2017-09-05 11:51:39-- https://lala.example.net/mon_appli/index.html
Connexion à lala.example.net (lala.example.net)|192.0.2.1|:443… connecté.
requête HTTP transmise, en attente de la réponse… 200
Taille : 11080 (11K) [text/html]
Sauvegarde en : « index.html »
Pour résoudre cela, on ajoute ce qui suit dans la configuration d'Apache httpd, en plus des directives ProxyPass
habituelles :
Header edit Location "(^http://)([^/]+)" ""
Ainsi, l'URL de redirection sera tronquée du protocole, elle sera relative. Le client web comprendra qu'il faut revenir en HTTPS et non pas en HTTP.
On reload
Apache httpd et on vérifie :
$ wget https://lala.example.net
--2017-09-05 11:52:01-- https://lala.example.net/
Résolution de lala.example.net (lala.example.net)… 192.0.2.1
Connexion à lala.example.net (lala.example.net)|192.0.2.1|:443… connecté.
requête HTTP transmise, en attente de la réponse… 302
Emplacement : /mon_appli/index.html [suivant]
--2017-09-05 11:52:01-- https://lala.example.net/mon_appli/index.html
Réutilisation de la connexion existante à lala.example.net:443.
requête HTTP transmise, en attente de la réponse… 200
Taille : 11080 (11K) [text/html]
Sauvegarde en : « index.html.1 »