Azure Web AppsのSSLでドハマリ

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

こんにちは、サイオステクノロジー技術部の武井です。今回は、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");

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

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

アバター画像
About 武井 宜行 269 Articles
Microsoft MVP for Azure🌟「最新の技術を楽しくわかりやすく」をモットーにブログtech-lab.sios.jp)で情報を発信🎤得意分野はAzureによるクラウドネイティブな開発(Javaなど)💻「世界一わかりみの深いクラウドネイティブ on Azure」の動画を配信中📹 https://t.co/OMaJYb3pRN
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

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

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


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

2 Comments

    • 佐藤様

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

さとうなおき へ返信する コメントをキャンセル

Your email address will not be published.


*


質問はこちら 閉じる