Comment faire pour que Jetty redirige http vers https


11

Je souhaite rediriger toutes les demandes de http vers https à l'aide de Jetty (6.1.24). Pour une raison (mon ignorance), cela m'échappe. Voici ce que j'ai:

<New id="redirect" class="org.mortbay.jetty.handler.rewrite.RedirectPatternRule">
  <Set name="pattern">http://foobar.com/*</Set>
  <Set name="location">https://foobar.com</Set>
</New>

En réponse, j'obtiens 200 - ok, et le corps est la page sur http, c'est-à-dire que la redirection ne se produit pas.


Je suppose que le serveur répond correctement si vous entrez manuellement une URL HTTPS. Pouvez-vous fournir des détails à partir de la sortie du journal de la jetée et / ou des détails de ce qui se passe dans votre navigateur - votre navigateur reçoit-il une redirection? Si oui, vers quelle URL avez-vous saisi et vers quelle URL vous a-t-il été redirigé?
Tim

Oui, la réponse du serveur correctement à la demande https. J'ai déjà découvert pourquoi j'obtenais un 502 auparavant, j'avais commenté l'auditeur de Jetty sur 8080 ...
Noel Kennedy

Réponses:


6

Parlant de Jetty 9 ... Voici comment vous pouvez le faire à condition que votre connecteur SSL fonctionne déjà:

Étape 1: Assurez-vous que tout passe par SSL en l'ajoutant à votre web.xml. Si vous essayez d'accéder à une ressource via HTTP, cela renverra une erreur 403! SECURE

<security-constraint>
  <web-resource-collection>
   <web-resource-name>Everything</web-resource-name>
   <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <user-data-constraint>
   <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint>
</security-constraint>

Étape 2: faites rediriger Jetty vers HTTPS lorsqu'il voit une erreur 403! SECURE en l'ajoutant à votre jetty.xml

<New id="tlsHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
   <Arg>
      <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
         <!-- This says... Redirect to https://host:8443 if server returns "NOT SECURE" error -->
         <Set name="secureScheme">https</Set>
         <Set name="securePort">8443</Set>
      </New>
   </Arg>
   <Call name="addCustomizer">
      <Arg>
         <New class="org.eclipse.jetty.server.SecureRequestCustomizer" />
      </Arg>
   </Call>
</New>

<!-- This is your HTTP connector, you should have another one for HTTPS -->
<New class="org.eclipse.jetty.server.ServerConnector">
   <Arg name="server">
      <Ref refid="MyServer" />
   </Arg>
   <Arg name="factories">
      <Array type="org.eclipse.jetty.server.ConnectionFactory">
         <Item>
            <New class="org.eclipse.jetty.server.HttpConnectionFactory">
               <Arg name="config">
                  <!-- defined above -->
                  <Ref refid="tlsHttpConfig" />
               </Arg>
            </New>
         </Item>
      </Array>
   </Arg>
   <Set name="host">localhost</Set>
   <Set name="port">8080</Set>
</New>

4

Je pense que le modèle ne correspond qu'à l'URI. Vous devez utiliser quelque chose comme:

<New id="forwardedHttps" class="org.eclipse.jetty.rewrite.handler.ForwardedSchemeHeaderRule">
           <Set name="header">X-Forwarded-Scheme</Set>
           <Set name="headerValue">https</Set>
           <Set name="scheme">https</Set>
</New>

Voir: http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/rewrite/handler/RewriteHandler.html


à partir de Jetty9, le lien devrait être eclipse.org/jetty/documentation/current/rewrite-handler.html
foo


0

Pour autant que je sache, ce n'est pas facile à faire avec les règles / gestionnaires fournis avec Jetty 6.

Les RedirectPatternRulecorrespondances sur le targetqui est le chemin d'accès sur le serveur Jetty, et non l'URI complet, donc votre règle ne correspond jamais.

Vous pouvez le changer en:

<New id="redirect" class="org.mortbay.jetty.handler.rewrite.RedirectPatternRule">
  <Set name="pattern">/*</Set>
  <Set name="location">https://foobar.com</Set>
</New>

Cependant, cela pose 2 problèmes:

  1. Il redirigera toutes les demandes (même les httpsdemandes)
  2. Il ne prend pas en compte l'URL demandée (il redirige toujours vers locationcomme il est spécifié et ignore tout ce qui a été trouvé par le pattern)

Vous pouvez surmonter le premier problème avec une supercherie.
Vous pouvez envelopper le RewriteHandlerdans un ContextHandler, et un gestionnaire de contexte vous permet de spécifier les connecteurs dont il traitera les demandes de ( setConnectorNames). Vous pouvez donc l'utiliser pour que la réécriture ne s'applique qu'aux requêtes sur le ou les connecteurs http.

Je ne peux pas penser à un moyen de surmonter le deuxième problème.

Je pense que votre meilleur pari sera d'écrire votre propre règle de redirection pour cela. Si vous n'avez pas de ressources de développement pour le faire pour vous, alors contactez-moi (vous pouvez trouver mon adresse e-mail via mon blog, qui est dans mon profil) et je peux en concocter une (sous la même licence que Jetty). Il sera assez simple d'écrire une règle qui redirige simplement http vers https.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.