Bagaimana agar Jetty mengalihkan http ke https

11

Saya ingin mengarahkan semua permintaan untuk http ke https menggunakan Jetty (6.1.24). Untuk beberapa alasan (ketidaktahuan saya), hal ini menghindarkan saya. Inilah yang saya miliki:

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

Sebagai tanggapan saya mendapatkan 200 - ok, dan tubuh adalah halaman lebih dari http, yaitu pengalihan tidak terjadi.

Noel Kennedy
sumber
Saya berasumsi bahwa server merespons dengan benar jika Anda memasukkan url HTTPS secara manual. Bisakah Anda memberikan perincian dari keluaran log dermaga dan / atau perincian tentang apa yang terjadi di peramban Anda - apakah peramban Anda mendapatkan arahan sama sekali? Jika demikian, URL apa yang Anda masukkan dan URL apa yang mengarahkan Anda?
Tim
Ya, respons server dengan benar terhadap permintaan https. Saya telah mengetahui mengapa saya mendapatkan 502 sebelumnya, saya telah berkomentar tentang pendengar Jetty di 8080 ...
Noel Kennedy

Jawaban:

6

Speaking for Jetty 9 ... Begini cara Anda melakukannya asalkan konektor SSL Anda sudah berfungsi:

Langkah 1: Pastikan semuanya berjalan melalui SSL dengan menambahkan ini ke web.xml Anda. Jika Anda mencoba mengakses sumber daya melalui HTTP, ini akan menghasilkan kesalahan 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>

Langkah 2: Minta Jetty mengalihkan ke HTTPS saat melihat kesalahan 403! SECURE dengan menambahkan ini ke jetty.xml Anda

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

Saya pikir polanya hanya cocok dengan URI. Anda harus menggunakan sesuatu seperti:

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

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

Mircea Vutcovici
sumber
1

Saya baru saja menambahkan dokumen: http://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https

Kent Tong
sumber
1
Selamat Datang di Kesalahan Server! Secara umum kami menyukai jawaban di situs untuk dapat berdiri sendiri - Tautan bagus, tetapi jika tautan itu putus, jawabannya harus memiliki informasi yang cukup untuk tetap membantu. Silakan pertimbangkan untuk mengedit jawaban Anda untuk memasukkan lebih detail.
voretaq7
0

Sejauh yang saya tahu, ini tidak mudah dilakukan dengan aturan / penangan yang dikirim bersama Jetty 6.

The RedirectPatternRulepertandingan di targetyang merupakan jalan di server Jetty, dan tidak penuh URI, sehingga aturan Anda tidak pernah cocok.

Anda dapat mengubahnya menjadi:

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

Namun, itu memiliki 2 masalah:

  1. Ini akan mengarahkan ulang semua permintaan (bahkan httpspermintaan)
  2. Tidak memasukkan URL yang diminta ke akun (selalu diarahkan ke locationseperti yang ditentukan, dan mengabaikan apa pun yang cocok dengan pattern)

Anda dapat mengatasi masalah pertama dengan beberapa tipu daya.
Anda dapat membungkus RewriteHandlerdalam ContextHandler, dan penangan konteks memungkinkan Anda untuk menentukan konektor akan menangani permintaan dari ( setConnectorNames). Jadi, Anda bisa menggunakannya untuk membuat penulisan ulang hanya berlaku untuk permintaan pada konektor http.

Saya tidak bisa memikirkan cara untuk mengatasi masalah kedua.

Saya pikir taruhan terbaik Anda adalah menulis aturan pengalihan Anda sendiri untuk ini. Jika Anda tidak memiliki sumber daya pengembangan untuk melakukannya untuk Anda, maka hubungi saya (Anda dapat menemukan alamat email saya melalui blog saya, yang ada di profil saya) dan saya dapat menyiapkannya (di bawah lisensi yang sama dengan Jetty). Akan sangat mudah untuk menulis aturan yang hanya mengalihkan http ke https.

Tim
sumber