やりたいこと
ユーザのブラウザからELBまではhttpsで通信、ELBからアプリケーションサーバまではhttpで通信させる
→ これをWikipedia - SSLオフロード, 英語版 TLS termination proxyと言う。Rails, ngnix, ELBでやったことはあったけど、Springではやったことない。そしてできればHttpsを強制させたい。
- Spring-security側の設定については以下のブログポストが詳しい
Springのソース改変するのは面倒なのでミドルウェア層で解決する。
Tomcatでの設定例
以下のブログポストでTomcatでの設定例がある、詳しくはブログポストを見てほしいが基本的にはserver.xmlの記述を書き換えるだけでよい
HTTP (80) -----> ELB -----> Tomcat (8080)
HTTPS (443) -----> ELB -----> Tomcat (8080)
これで、ELB経由してるブラウザからはHttpsで全部通信してるようになる。
Jetty9での設定
ここからは自分が調査したところになる、Jettyはバージョンによって内部のクラスが結構変わるので、古いWikiなどを見ると設定が通らないことがある。
最終的にはこの部分をアンコメントすることで、Tomcatと同等の設定ができた。
<New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
...
<!-- Uncomment to enable handling of X-Forwarded- style headers -->
<Call name="addCustomizer">
<Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
</Call>
</New>
ForwardedRequestCustomizerはロードバランサから送られるX-Forwarded
のヘッダがついたリクエストを良しなに処理してくれる。