Cómo hacer que Jetty redirija http a https

11

Quiero redirigir todas las solicitudes de http a https usando Jetty (6.1.24). Por alguna razón (mi ignorancia) esto me está eludiendo. Esto es lo que tengo:

<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 respuesta obtengo 200 - ok, y el cuerpo es la página sobre http, es decir, la redirección no ocurre.

Noel Kennedy
fuente
Supongo que el servidor responde correctamente si ingresa manualmente una URL HTTPS. ¿Puede proporcionar algún detalle de la salida del embarcadero y / o detalles de lo que está sucediendo en su navegador? ¿Su navegador obtiene una redirección? De ser así, ¿a qué URL ingresó y a qué URL lo redirigió?
Tim
Sí, la respuesta del servidor correctamente a la solicitud https. He descubierto por qué estaba obteniendo un 502 antes, había comentado el oyente de Jetty en 8080 ...
Noel Kennedy

Respuestas:

6

Hablando por Jetty 9 ... Así es como puede hacerlo siempre que su conector SSL ya funcione:

Paso 1: asegúrese de que todo pase por SSL agregando esto a su web.xml. Si intenta acceder a un recurso a través de HTTP, esto devolverá un error 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>

Paso 2: ¡ Haga que Jetty redirija a HTTPS cuando vea un error 403! SECURE agregando esto a su 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>
Emre Colak
fuente
4

Creo que el patrón solo coincide con el URI. Deberías usar algo como:

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

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

Mircea Vutcovici
fuente
a partir de Jetty9, el enlace debe ser eclipse.org/jetty/documentation/current/rewrite-handler.html
foo
1

Acabo de agregar el documento: http://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https

Kent Tong
fuente
1
¡Bienvenido a Server Fault! En general, nos gustan las respuestas en el sitio para poder sostenerse por sí mismas. Los enlaces son geniales, pero si ese enlace alguna vez se rompe, la respuesta debería tener suficiente información para ser útil. Considere editar su respuesta para incluir más detalles.
voretaq7
0

Por lo que puedo decir, esto no es fácil de hacer con ninguna de las reglas / controladores que se envían con Jetty 6.

Las RedirectPatternRulecoincidencias en targetcuál es la ruta en el servidor Jetty, y no el URI completo, por lo que su regla nunca coincide.

Puedes cambiarlo a:

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

Sin embargo, eso tiene 2 problemas:

  1. Redirigirá todas las solicitudes (incluso las httpssolicitudes)
  2. No tiene en cuenta la URL solicitada (siempre redirige a locationcomo se especifica e ignora todo lo que coincida con pattern)

Puedes superar el primer problema con algunos trucos.
Puede ajustarlo RewriteHandleren a ContextHandler, y un controlador de contexto le permite especificar de qué conectores manejará las solicitudes de ( setConnectorNames). Por lo tanto, puede usar eso para hacer que la reescritura solo se aplique a las solicitudes en los conectores http.

Sin embargo, no puedo pensar en una forma de superar el segundo problema.

Creo que su mejor opción será escribir su propia regla de redireccionamiento para esto. Si no tiene recursos de desarrollo para hacer eso por usted, contácteme (puede encontrar mi dirección de correo electrónico a través de mi blog, que está en mi perfil) y puedo preparar una (bajo la misma licencia que Jetty). Será bastante sencillo escribir una regla que simplemente redirija http a https.

Tim
fuente