Come fare in modo che Jetty reindirizzi http su https


11

Voglio reindirizzare tutte le richieste di http su https usando Jetty (6.1.24). Per qualche ragione (la mia ignoranza) questo mi sfugge. Questo è quello che ho:

<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>

In risposta ottengo 200 - ok, e il corpo è la pagina su http, cioè il reindirizzamento non si verifica.


Presumo che il server risponda correttamente se si inserisce manualmente un URL HTTPS. Puoi fornire dettagli dall'output del log del molo e / o dettagli di ciò che sta accadendo nel tuo browser: il tuo browser riceve un reindirizzamento? In tal caso, quale URL hai inserito e a quale URL ti ha reindirizzato?
Tim

Sì, risposta del server correttamente alla richiesta https. Ho scoperto perché stavo ottenendo un 502 prima, avevo commentato l'ascoltatore di Jetty su 8080 ...
Noel Kennedy

Risposte:


6

Parlando per Jetty 9 ... Ecco come puoi farlo a condizione che il tuo connettore SSL funzioni già:

Passaggio 1: assicurati che tutto passi attraverso SSL aggiungendolo al tuo web.xml. Se si tenta di accedere a una risorsa tramite HTTP, verrà restituito un errore 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>

Passaggio 2: fai reindirizzare Jetty su HTTPS quando rileva un errore 403! SICURE aggiungendolo a 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

Penso che il modello corrisponda solo all'URI. Dovresti usare qualcosa come:

<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>

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


a partire da Jetty9, il link dovrebbe essere eclipse.org/jetty/documentation/current/rewrite-handler.html
foo


0

Per quanto posso dire, questo non è facile da fare con nessuna delle regole / gestori che vengono spediti con Jetty 6.

Le RedirectPatternRulecorrispondenze su targetquale è il percorso nel server Jetty e non sull'URI completo, quindi la regola non corrisponde mai.

Puoi cambiarlo in:

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

Tuttavia, ciò ha 2 problemi:

  1. Reindirizzerà tutte le richieste (anche httpsrichieste)
  2. Non tiene conto dell'URL richiesto (reindirizza sempre a locationcome è specificato e ignora tutto ciò che è stato abbinato dal pattern)

Puoi superare il primo numero con qualche trucco.
È possibile racchiudere RewriteHandlerin a ContextHandlere un gestore di contesto consente di specificare da quali connettori gestirà le richieste ( setConnectorNames). Quindi, potresti usarlo per fare in modo che la riscrittura si applichi solo alle richieste sui connettori http.

Non riesco a pensare a un modo per superare il secondo problema.

Penso che la tua migliore scommessa sarà quella di scrivere la tua regola di reindirizzamento per questo. Se non hai risorse di sviluppo per farlo, contattami (puoi trovare il mio indirizzo e-mail tramite il mio blog, che è nel mio profilo) e posso crearne uno (con la stessa licenza di Jetty). Sarà abbastanza semplice scrivere una regola che reindirizzi semplicemente http a https.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.