ロードバランサーでSSLを終了し、HTTP経由でバックエンドインスタンスと通信するようにELBを設定したいと思います。 ELBに有効な証明書をアップロードしました。以下の設定をした場合
ELB-HTTPS
バックエンド-HTTP
次に、アプリケーションがアプリケーションでリダイレクトを実行すると、クライアント/ブラウザはHTTPSではなくHTTPにリダイレクトされます。
ただし、HTTPSとバックエンドインスタンスをHTTPSでも使用するようにELBを設定すると(自己署名証明書を使用している場合でも)、両方の構成がHTTPSであるため、すべてが正常に機能します。
私はTomcatをバックエンドインスタンスで使用しており、その間に他のレイヤーを使用したくない(nginxまたはhaproxyなど)
あなたの問題にかなり似ているこの記事を見つけました: http://willwarren.com/2014/01/27/running-Apache-Tomcat-with-ssl-behind-Amazon-elb/
基本的に、server.xmlを次のように変更することについて述べています。
<Connector
port="8080"
protocol="HTTP/1.1"
proxyPort="443"
scheme="https"
secure="true"
proxyName="myapp.example.com"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
私はこれをネットで見つけるのに苦労しました、そして最後にそれを行う方法を見つけました。
問題は、httpが内部的にELBのhttpsポートにリダイレクトされるとすぐに、ポート80にリダイレクトされてループが作成されることでした。これは、ELBがSSLをオフロードしてから、ポート80に再度接続するために発生します。
最後にいくつかの調査の後、ELBがSSLをオフロードしても、OriginリクエストがSSLを使用していたために、Tomcatが到達するような方法でX-Forwarded-Protoを管理するための正しい書き換えルールを取得しました。
これは、Tomcat8のTomcatバルブを使用して実行されます。以前のバージョンでも実行できることを確認してください。バルブを使用してTomcatで書き換えルールを有効にしました。その後は、Apacheでリダイレクトルールを作成するのと同じくらい簡単でした。
手順は次のとおりです。
ステップ1: a。 Tomcat confフォルダーの下のcontext.xmlを開きます。次の行をすぐ下に貼り付けます
<Valve className="org.Apache.catalina.valves.rewrite.RewriteValve" />
注:これにより、Valveがグローバルに有効になります。これを特定のホストに対して有効にする必要がある場合は、その特定のドメインのserver.xml内に貼り付ける必要があります
ステップ2:
a。 conf /server.xmlを開きますb。 </Host>
タグのすぐ上に次の行を貼り付けます
<Valve className="org.Apache.catalina.valves.rewrite.RewriteValve" />
ステップ3:
a。 web.xmlがあるフォルダーを開きます。たとえば、アプリケーションがROOTの下でホストされている場合、web.xmlはwebapps/ROOT/WEB-INFの下にあります
b。同様に、アプリケーションがwebapps/myappfolderでホストされている場合、web.xmlはwebapps/myappfolder/WEB-INFの下にあります。
c。 WEB-INFフォルダー内新しいファイルrewrite.configを作成します。次の書き換えルールを貼り付けます。
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301,NE]
Raviの回答のrewrite.configルールは私には機能しませんでした。 Tomcat 8.0.32、AWS ELB、およびEC2を使用する場合、私のルールは次のとおりです。
# bounce all requests coming in on HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule ^.*$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301,NE]
ところで:301のHTTPリダイレクトはブラウザにキャッシュされていることを忘れないでください。一度機能すると、ブラウザのキャッシュされたリダイレクトを取り除くまで、再び機能することはありません。
これは古い質問かもしれませんが、答えを見つけるのは困難でした。ここには2つの問題があります。1。TomcatWebコンテナはhttpでリクエストを受信しているため、構築するリダイレクトは同じになります。春はある程度の長さまで役立ちますが、不十分です。 2.ユーザーがHTTPにアクセスしようとしても、ユーザーをHTTPSにリダイレクトする
ELBはこの情報をヘッダーで送信するため、2番目の問題は簡単です。既存のフィルターまたは新しいフィルターに簡単なコードを追加することで実行できます
String protocol =req.getHeader("X-Forwarded-Proto");
if(protocol!=null && "http".equalsIgnoreCase(protocol)){
rep.sendRedirect( req.getRequestURL().toString().replaceFirst("http", "https"));
return;
}
最初の問題の解決策の1つは、Springサーブレットのビューリゾルバーにプロパティ(redirectHttp10Compatible)を追加することでした。
<bean id="tilesviewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
<property name="redirectHttp10Compatible" value="false" />
</bean>
リダイレクトだけが春までに問題であった場合、人生は良かったが、問題はコンテナ自体にあるので、より多くの助けが必要でした。最終的な解決策は、server.xmlを操作し、TomcatエンジンのRemoteIpValveプロパティを追加することです JavaDoc for RemoteIpValve
これが最終的な修正でした。お役に立てば幸いです。