Bonjour à tous,
J'ai un problème dans la mise en oeuvre de HTTPS sur notre application : Apache 2.2 en frontal de JOnAS 4.10.3 avec mod_jk pour la communication Apache / JOnAS.
Dans la conf Apache, j'ai 2 hôtes virtuels, un pour HTTP, un pour HTTPS qui redirigent tous les 2 vers la même instance JOnAS (il n'y en a qu'une dans cet environnement) :
Extraits :
Où LB est le worker "load balancer" qui renvoie vers l'instance JOnAS.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <VirtualHost monserveur:14711> (...) JkMount /* LB (...) </VirtualHost> <VirtualHost _default_:14712> (...) JkMount /* LB (...) </VirtualHost>
De cette façon, je peux accéder à l'appli en HTTP via le premier hôte virtuel avec l'URL http://monserveur:14711
Cela marche OK. Toutes les pages de l'application sont en HTTP.
Je peux aussi accéder à l'appli en HTTPS via le second hôte virtuel avec l'URL https://monserveur:14712
Cela marche OK. Toutes les pages de l'application sont en HTTPS.
Maintenant, je voudrais que pour certaines pages, on commute de HTTP en HTTPS.
Nous n'avons qu'une seule servlet de traitement : elle s'appelle TraitementServlet.
J'ai déclaré une seconde servlet : SSLTraitementServlet qui pointe vers la même classe Java. Elle est utilisée pour indiquer à Apache qu'il faut basculer en HTTPS.
Cela se fait en utilisant mod_rewrite qui permet de rediriger une URL, il y a de nombreux exemples sur internet où on redirige du HTTP sur du HTTPS de cette façon.
J'ai donc rajouté dans l'hôte virtuel pour HTTP les lignes suivantes :
("si on trouve /servlet/SSLTraitementServlet dans l'URL, on renvoie sur l'URL HTTPS")
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 RewriteEngine on RewriteCond %{REQUEST_URI} /servlet/SSLTraitementServlet RewriteRule ^/(.*) https://monserveur:14712/$1
La redirection se passe bien, sauf que tous les champs de formulaire envoyés en POST en HTTP sont "perdus" en HTTPS (en POST, ils ne transitent pas sur l'URL mais dans le header HTTP).
L'application ne trouve aucun paramètre et renvoie une erreur.
J'ai fait le test avec les lignes suivantes :
("si on trouve /servlet/SSLTraitementServlet dans l'URL, on renvoie sur l'URL HTTP, donc non HTTPS")
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 RewriteEngine on RewriteCond %{REQUEST_URI} /servlet/SSLTraitementServlet RewriteRule ^/(.*) http://monserveur:14711/$1
Dans ce cas, les champs du formulaire ne sont pas perdus, c'est donc bien le passage de HTTP en HTTPS qui cause cette perte.
Que puis-je faire ?
1) Passer les champs en GET pour ces pages, donc les avoir dans l'URL ?
Cela marcherait mais... il n'est pas recommandé d'afficher ainsi les paramètres en clair, d'abord pour des raisons de sécurité, et ensuite parce que l'URL a une longueur limitée (2048 caractères pour IE en GET : http://support.microsoft.com/default...NoWebContent=1).
2) Ou bien paramétrer différemment le rewrite mais je ne vois pas comment...
3) Ou bien faire totalement différemment ???
Avez-vous connaissance de projets qui ont fait cela : basculer des parties de sites de HTTP en HTTPS en conservant des champs de formulaire transmis en POST ?
Merci d'avance à tous.![]()
Partager