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.

Noel Kennedy
fonte
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>
Emre Colak
fonte
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

Mircea Vutcovici
fonte
a partir do Jetty9, o link deve ser eclipse.org/jetty/documentation/current/rewrite-handler.html
foo
1

Acabei de adicionar o documento: http://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https

Kent Tong
fonte
1
Bem-vindo à falha do servidor! Geralmente, gostamos de respostas no site para poderem permanecer por conta própria - os links são ótimos, mas se esse link quebrar, a resposta deve ter informações suficientes para continuar sendo útil. Considere editar sua resposta para incluir mais detalhes.
voretaq7
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.

Tim
fonte