So leiten Sie Jetty http zu https um


11

Ich möchte alle Anfragen für http mit Jetty (6.1.24) an https umleiten. Aus irgendeinem Grund (meiner Unwissenheit) entgeht mir dies. Das habe ich:

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

Als Antwort bekomme ich 200 - ok, und der Text ist die Seite über http, dh die Weiterleitung findet nicht statt.


Ich gehe davon aus, dass der Server korrekt reagiert, wenn Sie manuell eine HTTPS-URL eingeben. Können Sie Details aus der Ausgabe des Stegprotokolls und / oder Details zu den Vorgängen in Ihrem Browser angeben? Erhält Ihr Browser überhaupt eine Weiterleitung? Wenn ja, welche URL haben Sie eingegeben und zu welcher URL wurden Sie weitergeleitet?
Tim

Ja, Server antwortet korrekt auf https-Anfrage. Ich habe herausgefunden, warum ich eine 502 bekommen habe, ich hatte Jettys Hörer auf 8080 auskommentiert ...
Noel Kennedy

Antworten:


6

Apropos Steg 9 ... So können Sie das tun, vorausgesetzt, Ihr SSL-Connector funktioniert bereits:

Schritt 1: Stellen Sie sicher, dass alles über SSL läuft, indem Sie dies zu Ihrer web.xml hinzufügen. Wenn Sie versuchen, über HTTP auf eine Ressource zuzugreifen, wird ein 403! SECURE-Fehler zurückgegeben

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

Schritt 2: Lassen Sie Jetty zu HTTPS umleiten, wenn ein 403! SECURE-Fehler angezeigt wird, indem Sie diesen zu Ihrer jetty.xml hinzufügen

<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

Ich denke, dass das Muster nur mit dem URI übereinstimmt. Sie sollten etwas verwenden wie:

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

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



1

1
Willkommen bei Server Fault! Im Allgemeinen möchten wir, dass Antworten auf der Website für sich alleine stehen - Links sind großartig, aber wenn dieser Link jemals unterbrochen wird, sollte die Antwort genügend Informationen enthalten, um dennoch hilfreich zu sein. Bitte bearbeiten Sie Ihre Antwort, um weitere Details zu erhalten.
voretaq7

0

Soweit ich das beurteilen kann, ist dies mit den Regeln / Handlern, die mit Jetty 6 geliefert werden, nicht einfach.

Die RedirectPatternRuleÜbereinstimmungen auf dem targetPfad im Jetty-Server und nicht der vollständige URI, sodass Ihre Regel niemals übereinstimmt.

Sie können es ändern in:

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

Dies hat jedoch zwei Probleme:

  1. Es werden alle Anfragen (auch httpsAnfragen) umgeleitet.
  2. Die angeforderte URL wird nicht berücksichtigt (sie leitet immer locationwie angegeben weiter und ignoriert alles, was mit dem übereinstimmt pattern).

Sie können das erste Problem mit einigen Tricks überwinden.
Sie können das RewriteHandlerin ein einschließen ContextHandler, und mit einem Kontext-Handler können Sie angeben, welche Konnektoren Anforderungen von ( setConnectorNames) verarbeiten sollen. Sie können dies also verwenden, um das Umschreiben nur auf Anforderungen auf den http-Connectors anzuwenden.

Ich kann mir jedoch keinen Weg vorstellen, um das zweite Problem zu lösen.

Ich denke, Ihre beste Wette ist es, Ihre eigene Umleitungsregel dafür zu schreiben. Wenn Sie keine Entwicklungsressourcen haben, um dies für Sie zu tun, kontaktieren Sie mich (Sie finden meine E-Mail-Adresse über meinen Blog, der sich in meinem Profil befindet) und ich kann eine erstellen (unter derselben Lizenz wie Jetty). Es ist ziemlich einfach, eine Regel zu schreiben, die http einfach zu https umleitet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.