IIS7.0でServer Name Indication(SNI)を使って1つのIPに複数のHTTPSサイトをバインドする方法
HTTP1.1では、クライアントからのHTTPリクエストに記載されているホスト名を読んで、返答するWebサイトを判定することができます。(name based とかで検索すると出てきます)
しかしながらSSLサイト(HTTPS)の場合、これができないため、SSLを使用するサイト毎にIPアドレスを割り振る必要があります。
なぜかというと・・SSL通信の場合、クライアントはHTTPリクエストをサーバに投げる前にSSL暗号化の接続を行います。そして、暗号化が完了したのちにクライアントはHTTPリクエストを送信するのですが、その時にHTTPサーバは、暗号化済みHTTPヘッダーを復号化してホスト名を取りだす、という作業を行えません。
※大体こんな感じ、というくらいのノリで考えてください。
ですため、IPアドレスで応答するホストを判別しないといけないわけなんです。
しかしながら、JPRSも告知している通り、IPv4アドレスは早ければ2010年、遅くても2013年には使い切ってしまい、新しく割り振りを受けることが出来なくなってしまいます。
一方では、個人情報保護の関係上、WebサイトにSSLを使用する必要性は非常に高まっていますので、IPアドレスの必要性が高まっています。。
けれども、実はこの解決法はRFCにも記述されているんです。
RFC 3546 Transport Layer Security (TLS) Extensions
これによると、SSL接続時、最初のCLIENT HELLOと同時に要求ホスト名もサーバに投げるのでサーバはホスト名に応じた返答すればOK、ということのようです。
さて、IISではSNIでのレスポンスに6.0から対応していました。ただし、コマンドでのみのサポートとなります。
IIS7.0では管理コンソールから登録できるようになったかな?と調べてみましたが、やはりコマンドラインだけでのサポートとなっているようです。
せっかくなのでコマンドでも・・
appcmd set site /site.name:"サイト名" /+bingings.[protocol='https',bindingInformation='*:443:listenしたいホスト名']
なお、登録したものを消したい場合、/+bindingsのプラスをマイナスにすればOKです。
※ただし、クライアントのブラウザ側でも対応してくれないと使えないのですが・・・
IE7/8,FireFox2/3,GoogleChromeは対応済みだそうですから、以後数年以内には実用化できるのではないでしょうか。