Jak zmusić Jetty do przekierowania http na https

11

Chcę przekierować wszystkie żądania http do https przy użyciu Jetty (6.1.24). Z jakiegoś powodu (moja ignorancja) to mi umyka. Oto co mam:

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

W odpowiedzi otrzymuję 200 - ok, a ciało to strona ponad http, tzn. Przekierowanie nie występuje.

Noel Kennedy
źródło
Zakładam, że serwer odpowiada poprawnie, jeśli ręcznie wprowadzisz adres URL HTTPS. Czy możesz podać jakieś dane z wyjścia dziennika pomostowego i / lub szczegóły tego, co dzieje się w przeglądarce - czy przeglądarka w ogóle otrzymuje przekierowanie? Jeśli tak, to jaki adres URL podałeś i na który adres przekierował Cię?
Tim
Tak, odpowiedź serwera poprawnie na żądanie https. Dowiedziałem się, dlaczego dostawałem 502, skomentowałem słuchacza Jetty na 8080 ...
Noel Kennedy

Odpowiedzi:

6

Mówiąc za Jetty 9 ... Oto, jak możesz to zrobić, pod warunkiem że twój łącznik SSL już działa:

Krok 1: Upewnij się, że wszystko przechodzi przez SSL, dodając to do pliku web.xml. Próba uzyskania dostępu do zasobu przez HTTP spowoduje zwrócenie błędu 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>

Krok 2: Poproś Jetty o przekierowanie do HTTPS, gdy zobaczy błąd 403! BEZPIECZNY, dodając go do pliku 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
źródło
4

Myślę, że wzorzec pasuje tylko do identyfikatora URI. Powinieneś użyć czegoś takiego:

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

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

Mircea Vutcovici
źródło
1

Właśnie dodałem dokument: http://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https

Kent Tong
źródło
1
Witaj w Server Fault! Zasadniczo podoba nam się, że odpowiedzi na stronie są w stanie samodzielnie działać - linki są świetne, ale jeśli ten link kiedykolwiek się zepsuje, odpowiedź powinna zawierać wystarczającą ilość informacji, aby nadal być pomocna. Proszę rozważyć edycję swojej odpowiedzi, aby zawierała więcej szczegółów.
voretaq7
0

O ile mi wiadomo, nie jest to łatwe do wykonania z żadnymi regułami / procedurami obsługi, które są dostarczane z Jetty 6.

Te RedirectPatternRulemecze na targetktóra to ścieżka na serwerze pomost, a nie pełny URI, więc reguła nie jest dopasowanie.

Możesz to zmienić na:

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

Ma to jednak 2 problemy:

  1. Przekieruje wszystkie żądania (nawet httpsżądania)
  2. Nie bierze pod uwagę żądanego adresu URL (zawsze przekierowuje do locationpodanego adresu i ignoruje wszystko, co pasowało pattern)

Możesz rozwiązać pierwszy problem za pomocą podstępów.
Możesz owinąć RewriteHandlerw ContextHandler, a moduł obsługi kontekstu pozwala określić, które łączniki będą obsługiwały żądania od ( setConnectorNames). Możesz więc użyć tego, aby przepisywanie dotyczyło tylko żądań na łącznikach HTTP.

Nie mogę jednak wymyślić sposobu na rozwiązanie drugiego problemu.

Myślę, że najlepszym rozwiązaniem będzie napisanie w tym celu własnej reguły przekierowań. Jeśli nie masz do tego odpowiednich zasobów programistycznych, skontaktuj się ze mną (możesz znaleźć mój adres e-mail za pośrednictwem mojego bloga, który znajduje się w moim profilu), a ja mogę utworzyć jeden (na tej samej licencji, co Jetty). Łatwo będzie napisać regułę, która po prostu przekieruje http na https.

Tim
źródło