Apache 2.2 単一サーバ上に複数サイトの SSL を実装する

単一の Apache で複数の SSL サイトを収容したいという話になりまして。

 

1 つの IP アドレスに複数の SSL サイトを入れるのは難しい

 

通常の HTTP プロトコルであれば、サーバ側は名前ベースの VirtualHost を使うのが一般的です。IP アドレス 1 つでよく、HTTP リクエストの Host ヘッダによってどの VirtualHost の領域に接続するか決まります。 カンタンですね。

さてここで SSL です。SSL ということはどういうことか。通信内容は暗号化されていて、復号しないと中身がわからない、復号して HTTP リクエスト内に含まれている Host ヘッダを見ないと VirtualHost の振り分けができない。 名前ベースの VirtualHost をつかって SSL のサイトを複数構築しようとしても、 SSL 通信に使う証明書がどの VirtualHost のものなのかを事前に知ることができないのです。どの証明書を使ってSSL通信するかを決めるための情報が暗号化されたパケットの中に入っているというにっちもさっちもいかない状態です。

なので Apache は、同一IPアドレスで一番最初に定義された VirtualHost 用の SSL 証明書を使います。なので、サーバのIPアドレス1つにつきSSL証明書は1つしか使えないという制限が出てきてしまいます。

 

それでも 1 つの IP アドレスに複数の SSL サイトを入れたい

 

これは不便なので新しい仕組みが出てきています。TLS のハンドシェイク時にホスト名のところだけ平文で伝えるという感じです。SNI、Server Name Indication という仕組みです。しかしこれは ブラウザとサーバと両方が対応している必要があり、まだ非対応のブラウザが多い現在では、たくさんのお客さんを相手にするようなサイトでは使い辛いです。

ほかには、一つの証明書の中に複数のドメインの情報を入れてしまえという方法。SANs、Subject Alternate Names というフィールドに複数の FQDN を入れておけば、一つの証明書に別名が入っていて、別名でもって FQDN の正当性を確認するといったような感じです。この方法だと新たに証明書をもらわないといけないので少し面倒です。

 

仕方なく複数 IP アドレス振って複数の SSL サイトを入れる

 

僕はあきらめました。今回は SSL の証明書を統合することができなくて(技術的な問題ではなくて契約的な問題です)、古いブラウザにも対応しないといけない。仕方なく SSL サイトの数だけ IP アドレスを準備しました。

そうそう、今回は Apache じゃなくて IHS っていう Apache ベースの Web サーバを使ったのだけど、IHS を使ったときの Name based VirtualServer と IP based VirtualServer の設定方法サンプルが載ってたのでコレを参考にしました → IBM IP-Based Virtual Hosting must be used if configuring multiple SSL Virtual Hosts - United Stateshttpd.conf の書式は Apache と同じです。 SSL まわりの指定方法が違うだけ。 OpenSSL じゃなくて GSKit を使っているのかな。