HTTPS を使うとき、ウェブサーバには SSL証明書をインストールする。通常、一台のサーバにつき一つしか、SSL証明書はインストールできない。いや、できるのだが、複数のIPアドレスをサーバに割り当てるか、別のポートでHTTPリクエストを受けるかをしなくてはならない。前者は Amazon EC2 をはじめとするレンタルサーバでは使えないことが多いし、後者はビジネス要件として許されないことが多い。

一般的に使われている名前ベースのバーチャルホストでなぜ複数証明書を使えないのか。それは、どのバーチャルホストを使うかを決める情報が、クライアントから送られるHTTPリクエストヘッダ中のHostフィールドに入っているからである。つまりHTTPレイヤの情報だからだ。HTTPS で通信するときは、まずクライアントとサーバとで SSL の通信路を確立してから、HTTPのリクエストを送る。どのバーチャルホストを使うかという情報は SSL の通信確立の時点では知りようがないため、複数の SSL 証明書の中から選んで通信することができない。

これを解決する方法がいくつかあるが、どれも使い勝手がよくない。1つ目はワイルドカード証明書を使う方法。hoge.example.com と bar.example.com というような2ドメインを対象としたいようなときは、この手が使える。ただし example.com や sub.hoge.example.com などのように、階層がずれたものは対象にできない。

2つ目はSSL証明書の Subject Alternative Names を利用する方法。SSL証明書内部に、こっちのドメインもあっちのドメインも対象にするよ、という情報を Alternative Names(別名)として埋め込むことができる。すごく便利なようだが、ガラケーが未対応なので、携帯サイトを作りたいときには使えない。

3つ目は、Server Name Indication という SSL の拡張仕様を使う方法。どのバーチャルホストを使うかを、SSL のプロトコルで指定できるようにしたものだが、未対応のクライアントも多いため、まだ利用できる状況にはない。

というわけで、複数のドメインでSSLを使う場合は、複数のIPアドレス、あるいは複数のサーバ(つまり複数のIPアドレス)を用意しましょう、というのが現時点での標準的な方式になっている。あと3年はこのままだろう。