Como o Jetty redirecionar http para https


11

Quero redirecionar todos os pedidos de http para https usando o Jetty (6.1.24). Por alguma razão (minha ignorância), isso está me iludindo. Isto é o que eu tenho:

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

Em resposta, recebo 200 - ok, e o corpo é a página sobre http, ou seja, o redirecionamento não ocorre.


Presumo que o servidor responda corretamente se você inserir manualmente um URL HTTPS. Você pode fornecer detalhes da saída do registro do cais e / ou detalhes do que está acontecendo no seu navegador - o seu navegador recebe algum redirecionamento? Em caso afirmativo, em que URL você inseriu e para qual URL ele o redirecionou?
Tim

Sim, resposta do servidor corretamente à solicitação https. Eu descobri por que eu estava ficando um 502 antes, eu havia comentado ouvinte do Jetty em 8080 ...
Noel Kennedy

Respostas:


6

Falando sobre o Jetty 9 ... Veja como você pode fazê-lo, desde que o seu conector SSL já funcione:

Etapa 1: verifique se tudo passa por SSL adicionando isso ao seu web.xml. Se você tentar acessar um recurso por HTTP, isso retornará um erro 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>

Etapa 2: Faça o Jetty redirecionar para HTTPS quando ocorrer um erro 403! SECURE adicionando-o ao seu 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

Eu acho que o padrão está correspondendo apenas ao URI. Você deve 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>

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




0

Até onde eu sei, isso não é fácil de ser feito com nenhuma das regras / manipuladores enviados com o Jetty 6.

As RedirectPatternRulecorrespondências no targetqual é o caminho no servidor Jetty, e não o URI completo; portanto, sua regra nunca corresponde.

Você pode alterá-lo para:

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

No entanto, isso tem 2 problemas:

  1. Ele redirecionará todas as solicitações (mesmo httpssolicitações)
  2. Ele não leva em conta o URL solicitado (ele sempre redireciona para locationo que é especificado e ignora qualquer coisa que corresponda ao pattern)

Você pode superar o primeiro problema com alguns truques.
Você pode agrupar o RewriteHandlerem a ContextHandler, e um manipulador de contexto permite especificar de quais conectores ele manipulará as solicitações de ( setConnectorNames). Portanto, você pode usar isso para fazer com que a reescrita se aplique apenas às solicitações nos conectores http.

Não consigo pensar em uma maneira de superar a segunda questão.

Eu acho que sua melhor aposta será escrever sua própria regra de redirecionamento para isso. Se você não tiver recursos de desenvolvimento para fazer isso por você, entre em contato comigo (você pode encontrar meu endereço de e-mail no meu blog, que está no meu perfil) e eu posso preparar um (com a mesma licença do Jetty). Será bastante simples escrever uma regra que simplesmente redirecione http para https.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.