AndreasOesterle
I'm new here

Kann Jetty auch mit X-forwarded-scheme umgehen

Jump to solution

Hallo zusammen,

Wir versuchen derzeit den internal Jetty des Redaktionsservers hinter einem Proxy zu betreiben. Der Proxy wird dabei per HTTPS angesprochen und die Kommunikation zum Jetty Server erfolgt über HTTP. In der fs-webapp.xml kann man den SelectChannelConnector konfigurieren, dass der Jetty den x-forwarded-host Header Variableninhalt für Redirects verwendet in dem man den SelectChannelConnector auf forwarded=true setzt. Jetzt ist die Frage ob man auch konfigurieren kann, dass der Jetty auch den x-forwarded-scheme Header interpretieren kann?

In der Doku zum SelectChannelConnector konnte ich hier nichts finden http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/server/nio/SelectChannelConnect...

Im x-forwarded-scheme Header steht in unserem Fall drin, dass der Proxy über https angesprochen werden muss.

Es gibt auch noch andere Connectoren wie z.B. den ServerConnector. Dieser kann nach meiner Interpretation den Header interpretieren. Weiss jemand ob man diesen anstatt dem SelectChannelConnector verwenden kann?

Besten Dank!

1 Solution

Accepted Solutions

Hallo Herr Isenberg,

wir haben die Lösung für das Problem gefunden.

Der in FirstSpirit integrierte Jetty bringt bereits eine ForwardedSchemeHeaderRule mit.

Um ihn zu aktivieren haben wir in fs-webapp.xml einen RewriteHandler integriert über:

<!-- Add new RewriteHandler for https -->
<New id="RewriteHandler" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
<Set name="rules">
   <Array type="org.eclipse.jetty.rewrite.handler.Rule">
     <Item>
       <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>
     </Item>  
   </Array>
</Set>
</New>

Diesen Handler haben wir integriert in:

<!-- Set handler Collection Structure -->
<!-- ================================ -->
<Set name="handler">
    <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
        <Set name="handlers">
            <Array type="org.eclipse.jetty.server.Handler">
                <Item>
                    <Ref id="RewriteHandler"/>
                </Item>
                <Item>
                    <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
                </Item>
                <Item>
                    <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
                </Item>
            </Array>
        </Set>
    </New>
</Set>

Damit leitet der Jetty Server die Anfragen immer dann auf https weiter wenn der x-forwarded-scheme Header gesetzt ist.

Beste Grüsse

Andreas Österle

View solution in original post

7 Replies
isenberg
I'm new here

Hallo Herr Österle,

Sie können in fs-webapp.xml jeden beliebigen Connector aktivieren, der von den gewünschten Clients verwendet werden soll und kann. Der Support bezüglich Jetty durch e-Spirit endet jedoch dort, wo die Datei an Stellen geändert wird, die nicht im FirstSpirit Adminhandbuch behandelt werden.

Zum ServerConnector: Meinen Sie den SPDYServerConnector? Der stellt einen Connector für das SPDY-Protokoll bereit, nicht HTTP(S) in Version 1.0 oder 1.1.

Zum Betrieb des FirstSpirit-Servers mit Jetty hinter einem HTTPS-Reverse-Proxy siehe Kapitel 4.5.1 Apache HTTP-Server mit Servlet-Engine Jetty, speziell der letzte Abschnitt.

Ansonsten besteht die Möglichkeit einen AJP-Connector im Jetty zu aktivieren, dort besteht das Problem mit Host-Header und Schema hinter einem Reverse-Proxy nicht. Allerdings ist der Jetty-AJP-Connector nicht mit allen Proxies kompatibel, was man aber sofort beim ersten Test sehen kann, also ob es funktioniert oder nicht.

0 Kudos

In FirstSpirit 5.0R2 wird übrigens Jetty 8.1.3 verwendet.

Möglicherweise hilft folgende Diskussion zum Thema X-Forwared-Scheme weiter. Dort werden einige Lösungsmöglichkeiten genannt: http://jira.codehaus.org/browse/JETTY-628

Hallo Herr Isenberg!

Besten Dank für die Links.

Soweit ich das verstanden habe muss man zusätzlich einen Filter auf dem internen Jetty installieren, welcher den 'request.scheme' Parameter setzt. Ein Filter könnte der XForwardedFilter unter http://code.google.com/p/xebia-france/wiki/XForwardedFilter sein.

Ist es bei ihrer internen Jetty Installation für einen Kunden überhaupt möglich die Jetty Libraries zu erweitern?

Wir hatten einmal versucht den Jetty um eine Lib zu erweitern und dann wurde jedes Mal das Jetty Verzeichnis durch die Inhalte der jetty.zip aus der fs-server.jar überschrieben. Als wir versucht haben die Lib in das zip der fs-server.jar zu erweitern, ist der Server nicht mehr gestartet.

Beste Grüsse

Andreas Österle

0 Kudos

Hallo Herr Österle,

über den XForwardedFilter sollte es tatsächlich funktionieren. Aber Sie haben Recht, dass der Jetty innerhalb von FirstSpirit nicht beliebig erweitert werden kann, weil FirstSpirit einige Dateien verwaltet, also direkt beim Start überschreibt. Für Libraries gilt das aber nicht, die können Sie als JAR-Datei ohne auszupacken unter firstspirit5/shared/lib ablegen, wo sie beim Neustart des Java-Prozesses geladen werden. Optional können solche JARs auch als FirstSpirit-Modul (FSM-Datei) verpackt werden und über den FirstSpirit-Adminclient hochgeladen werden. Nur für die Konfiguration kann das FirstSpirit-Modul hier nicht verwendet werden, weil das nur für die WebApps fs5preview, fs5webedit und fs5staging vorgesehen ist, nicht für fs5root und fs5webmon. Die Datei fs-server.jar oder allgemein von e-Spirit ausgelieferte JARs können nicht geändert werden, weil dann die digitale Kryptosignatur ungültig wird und FirstSpirit nicht mehr startet bis die Datei durchs Original ersetzt wurde.

Die Konfiguration des XForwardedFilter müsste dann in der Datei webdefault.xml erfolgen, soweit ich das richtig lese. Die firstspirit50/server/jetty/webdefault.xml kann dazu aber nicht verwendet werden, weil sie von FirstSpirit überschrieben wird, stattdessen eine webdefault.xml in jedes WEB-INF/ unterhalb von firstspirit5/web/fs5* kopieren, nach jeder Aktualisierung des FirstSpirit-Servers.

Siehe zu webdefault.xml und Konfiguration des Jetty auch https://community.e-spirit.com/thread/2296 .

0 Kudos

Hallo Herr Isenberg,

wir haben die Lösung für das Problem gefunden.

Der in FirstSpirit integrierte Jetty bringt bereits eine ForwardedSchemeHeaderRule mit.

Um ihn zu aktivieren haben wir in fs-webapp.xml einen RewriteHandler integriert über:

<!-- Add new RewriteHandler for https -->
<New id="RewriteHandler" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
<Set name="rules">
   <Array type="org.eclipse.jetty.rewrite.handler.Rule">
     <Item>
       <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>
     </Item>  
   </Array>
</Set>
</New>

Diesen Handler haben wir integriert in:

<!-- Set handler Collection Structure -->
<!-- ================================ -->
<Set name="handler">
    <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
        <Set name="handlers">
            <Array type="org.eclipse.jetty.server.Handler">
                <Item>
                    <Ref id="RewriteHandler"/>
                </Item>
                <Item>
                    <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
                </Item>
                <Item>
                    <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
                </Item>
            </Array>
        </Set>
    </New>
</Set>

Damit leitet der Jetty Server die Anfragen immer dann auf https weiter wenn der x-forwarded-scheme Header gesetzt ist.

Beste Grüsse

Andreas Österle

Weil der Parameter forwarded=true nur im Text genannt ist, hier noch einmal der Hinweise darauf, dass dieser Parameter wichtig ist. Er muss in firstspirit5/conf/fs-webapp.xml im Abschnitt  org.eclipse.jetty.server.nio.SelectChannelConnector eingetragen werden:

<Set name="forwarded">true</Set>

Die von Herrn Österle hier gezeigte Konfiguration ist in die allgemeine Anleitung zum Betrieb von FirstSpirit als Backend hinter Frontend Webservern und Reverse Proxies übernommen und kann mit mit FirstSpirit in Version 5.0 und 5.1 verwendet werden: https://community.e-spirit.com/docs/DOC-1827

0 Kudos

Ich habe diesen Thread leider erst zu spät, dafür aber eine andere Lösungsmöglichkeit gefunden: In der "httpConfig"-Sektion haben wir den "ForwardedRequestCustomizer" (siehe Doku) hinzugefügt:

    <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">

        <!-- [sonstige Optionen ...] -->

        <Call name="addCustomizer">

            <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>

        </Call>

    </New>

Zusammen mit dem manuell in der Apache-Conf gesetzten Request-Header:

RequestHeader set X-Forwarded-Proto "https" env=HTTPS

werden alle Link-Schemata sauber auf https umgesetzt.

Viele Grüße,

Martin Kresse

0 Kudos