Azure Web AppsのSSLでドハマリ

こんにちは、サイオステクノロジー技術部の武井です。今回は、Azure Web AppsのSSL化でドハマリした記録を書こうと思います。ちなみに本件、ドハマリした挙句解決してません。その記録だけを書き留めようと思っただけです。

Azure Web Apps(Windows)は内部的に以下のような構成になっているらしいです。

Screen Shot 2017-10-21 at 0.03.02

Application Request Routingというリバースプロキシのようなものが、フロントでHTTPS(HTTPでも可)でリクエストを受けて、バックエンドにいるTomcatにhttpsでアクセスしてきます。なのでSSLの終端はApplication Request Routingで行います。

SSLしたかったので、https://〜でアクセスしたところ、途中でHTTPのアクセスになってしまうところがありました。HTTPヘッダ見てみたら、Locationヘッダにhttpsで返していたので、リダイレクトきっかけでHTTPになってしまうようでした。

たしかに、WebアプリケーションはHTTPでリクエストを受けているので、LocationヘッダにHTTPで返すだろうなぁと思いました。

そこで色々調べると、Spring Security(今回、Tomcat上で稼働しているアプリケーションが採用しているセキュリティフレームワーク)で、以下のような設定を入れると、HTTPでアクセスしてきた場合、HTTPSにリダイレクトしてくれるらしいです。こりゃいいとおもいました。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	@Override
	protected void configure(HttpSecurity https) throws Exception {
		https.authorizeRequests()
			.antMatchers("/**").hasRole("USER")
				.and()
			.formLogin()
				.and()
			.requiresChannel().anyRequest().requiresSecure();
	}
・・・

しかしこれではだめでした。リダイレクトループが発生してしまいました。多分、以下のようなことが起こっていると想像できます。

Screen Shot 2017-10-21 at 0.03.141.https://hoge.com/loginにアクセスします。

2.Application Request RoutingはHTTPに変換して、Tomcat上のWebアプリケーションにフォワードします。

3.Tomcat上のWebアプリケーションは、https://hoge.com/loginにリダイレクトします。正確に言うと、https://hoge.com/loginにリダイレクトするためのLocationヘッダをHTTPレスポンスに乗せます。

4.3のLocationヘッダをブラウザが受け取って、https://hoge.com/loginにリダイレクトする。

Screen Shot 2017-10-21 at 0.17.29

5.4のLocationヘッダを受けて、https://hoge.com/loginにアクセスします。

6.Application Request RoutingはHTTPに変換して、Tomcat上のWebアプリケーションにフォワードします。

7.Tomcat上のWebアプリケーションは、https://hoge.com/loginにリダイレクトします。正確に言うと、https://hoge.com/loginにリダイレクトするためのLocationヘッダをHTTPレスポンスに乗せます。

8.3のLocationヘッダをブラウザが受け取って、https://hoge.com/loginにリダイレクトする。

その後は、5に戻って、ひたすら5〜8の無限ループになります。

しかしながら、これを回避する方法があるとWebで見つけました。以下の設定をapplication.propertiesに入れます。

server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
security.require-ssl=true

Application Request Routingは、ブラウザのURLのスキームをx-forwarded-protoというHTTPヘッダに乗せて、Tomcatに送ってくれるらしいです。上記の設定をすることにより、Spring Securityは、ユーザーがHTTPSで接続してきたとき、つまりx-forwarded-protoヘッダの値がhttpsだったときはhttpsにリダイレクトしなくなるらしいのです。

Screen Shot 2017-10-21 at 0.26.49

この設定を施したのですが、やっぱり、無限ループになってしまいました。Web上ではこの方法で解決しているひとが多いのですが、なぜか私の環境ではだめでした。なんででしょうか?

困り果てたので、アプリケーションの中でリダイレクトを定義しているところを、全てスキームとFQDNを書くようにしました。つまり、例えば、

https.formLogin()
	.loginProcessingUrl("/login")
	.loginPage("/loginForm");

こう書いてたのを

https.formLogin()
	.loginProcessingUrl("/login")
	.loginPage("https://contoso.com/loginForm");

としました。めんどくさいですが、今のところ、これしか解決策がないのです。

誰か、教えてください・・・。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

2 COMMENTS

武井

佐藤様

コメントありがとうございます!!頂きました方法、ぜひ試してみたいと思います。

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です