Tumblrみてたら asp.net mvc – Windows Azure Multi-Tenant Application and SSL – Stack Overflow な話題が。
※SMarxが回答してたりする。
で、マルチテナントでマルチドメインできるの?という話題。まぁ以前からこの手の話はちょくちょく挙がってたので少し考えてみました。
まずマルチテナント/マルチテナンシーというのは大雑把にいって1つのアプリケーション/サービス上に複数のテナントが入っている状態をいうと思います。まぁ詳細は検索ってください。
で、Webアプリケーション内で完結してるマルチテナントな感じの場合(複数利用者が同一のWebアプリを使用する場合など)、これは何も問題ないですね。
というのもサービスを提供するドメインは1つ(~.cloudapp.net)だったりするので、HTTPSで使う証明書も非常にシンプルですし問題なくご利用いただけます。
さて1つのアプリケーションというよりは、1つのサービス(もしくはホスティングとかまぁ名前はどうでもいいのですが)で複数のアプリケーションを提供する場合。ここでいうサービスってのは、企業が提供するxxxサービスとかそういう感じの意味合いです。
具体的な例でいうと、実行基盤としてサーバー上で複数のWebサイトを展開してる場合などですね。
もう少し落とし込むと、Windows Azure上で(Windows Server上で)、複数のWebサイトを提供するケース。まぁそう考えると複数サービスでもいいわけですが要はマルチサイトなわけです。この時、同じポート/同じIPアドレス(バインド)を使用して複数のWebサイトを利用する場合、ホストヘッダを使ってどのサイトに接続されたのかを判断して振り分けます。
ホスト名ベースのバーチャルホストってやつですかね。
で話は少し前後しますがHTTPSで通信する際、暗号化されたHTTPな通信の前のネゴシエーション時に証明書やらを使った暗号化用の鍵の交換を行います。これがないとそれ以降の通信が暗号化できません。
あれ、ホストヘッダはHTTPな通信のヘッダに含まれるよね??じゃHTTPSな通信の場合、事前にホストヘッダ判断して証明書切り替えたり無理じゃね?というかホストヘッダ使ったマルチサイトって無理じゃね?ということに。
これじゃー無理だよーという結論になっちゃうのですが、さすがにそれは不便なのでTLS1.1(SSL3.2)以降ではネゴシエーション時にホスト名を渡すことができるようになりました(SNI:Server Name Indicationというそうで)。やったね。
※実際はTLS1.0後の拡張仕様内で定義されました
※ちなみにIPベースなバーチャルホストの場合はネゴシエーションの時点でホスト側が判断できるので問題ないです。ただWindows AzureはグローバルなIPはロールに対し1つだけしか割り当てられませんので、今回の話からは除外します。
参考:
さてプロトコルなところで見るとTLS1.1以降であればOKというのがわかりました。
でもですね、Server Name Indicationのページ見てみるとサポートしてるクライアントがですね、Windows XP+IEとかはOUTなんですね。あとIE9とか使ってても標準でTLS1.1/1.2の使用にはチェックがついていないので、何も気にせず使えるというものでもない感じです。
なんでデフォルトOFFなんだろー。。。
※でも標準で(TLS1.0はチェックついてるけど1.1/1.2にはついてない状態で)Windows VistaやWindows 7でマルチドメインな証明書使ったサイトはアクセスできるらしいので、「TLS1.0を使用する」でTLS拡張も含まれる=SNIもいけるんでしょうか?よくわかりませんね…
あとサーバー側ですが。IISが2009年現在でNo Supportとかに分類されてますがいやいやいや。
コマンドで設定しないといけないとか、ホスト(Webサイト)毎に異なる証明書を指定したりはできないけどNo Supportはないんじゃない?とか思います。
コマンドはこんな感じで、Webサイトに対してホストヘッダとバインドを指定することができます。
appcmd set site /site.name:"サイト名" /+bingings.[protocol=’https’,bindingInformation=’*:443:listenしたいホスト名’]
さてさて、これでHTTPSな時でもマルチサイトで(ホストヘッダで振り分けて)使えそうです。
でも何か忘れてますね。そう、証明書の問題ですね。
普通、このサイトはCAが認める正しいサイトですよ、というのを証明するのに証明書使います。(暗号化通信にも使いますがホスト名が正しいものであるというのは非常に重要です)
マルチサイトの場合、それぞれでサイト名というかホスト名が異なるわけですから、証明書をそれぞれ用意しないといけないですね。(でないとホスト名が一致しませんとかいろいろ警告でたり不都合です)
でもですね、IISでHTTPSなバインドするときに指定できる証明書は、そのサーバー上で1つだけみたいです。
つまるところ1つの証明書に提供するホスト名が含まれていないとNG(何かしら警告でちゃう)というわけです。
世の中便利なもので、ワイルドカードな証明書(*.xxxx.com とか)やマルチドメインの証明書(a.com , b.com , c.info など)を取得して使わないと要件を満たせそうにないですね。
まとめ
Windows Azure上でマルチテナント/マルチドメインする場合は
- Full IISを使ったWeb Roleで(IISを使って)
- マルチサイト構成にして各サイトにappcmdでHTTPSなバインドにホストヘッダを定義して
- マルチドメインの証明書を設定して(サービス設定ファイルで指定して)
- クライアントはTLS拡張に対応している
という条件を満たす必要がありそうですね。クライアントがちょっとあれかなぁ。まだワイルドカードなほうが現実的かもしれない。
うーんあってるのかな。というわけで今日はこのへんで。
気付けばあらやだ奥様、字ばっかりですわ。