Apache 2.2.16 における SSL の SNI 設定

Apache 2.2.12 以降では、SSL でも Server Name Indication (SNI) という仕組みで名前ベースのバーチャルホストが設定可能です。

と言うわけで、自サーバ (Debian GNU/Linux Squeeze + apache 2.2.16) で設定をしてみました。

と言っても特別なことは不要で、普通に 80 番ポートの名前ベースのバーチャルホストと同じように設定すれば良いだけです。

・/etc/apache2/ports.conf

NameVirtualHost *:80
Listen 80
<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

SSL で使用する TCP 443 ポートでも「NameVirtualHost」の指定をしてあげます。

・/etc/apache2/mods-available/ssl.conf

SSLStrictSNIVHostCheck Off

上記の指定を追加します。

「SSLStrictSNIVHostCheck Off」は、SNI 非対応環境からのアクセスの場合、一番最初のデフォルトのバーチャルホストへのアクセスを許可する設定です。これを「On」とした場合、SNI 非対応環境からは SSL サイトへの接続自体が拒否されます。

あとは、普通に /etc/apache2/sites-available 以下に通常のバーチャルホストと同じ感覚で、SSL サイトのバーチャルホストを作成していき、a2ensite で有効にします。

ただし、デフォルトとして使用するバーチャルホストは最初に読み込まれる必要があるので、例えば、https://www.example.com/ (設定ファイルは www.example.com-ssl) と https://www.example.net/ (設定ファイルは www.example.net-ssl) があり、SNI 非対応環境からのアクセスは https://www.example.com/ と限定する場合、下記のようにシンボリックリンクのファイル名を変更します。

# cd /etc/apache2/sites-enabled/
# mv www.example.com-ssl 000-www.example.com-ssl
# /etc/init.d/apache2 restart

これで、SNI 対応環境からはそれぞれ該当の SSL サイトへ名前ベースのバーチャルホストでアクセスできるようになります。

なお、SNI 非対応環境からは https://www.example.com/ では証明書エラーが発生せず通常にアクセス可能、https://www.example.net/ では証明書エラーが発生するようになります。

ちなみに、Mac OS X 10.6 の Safari 5.1.7 や、Windows XP の Firefox 13.0.1 では正常にそれぞれの SSL サイトへのアクセスが出来ました。

謎なのが、Windows XP 上の Internet Explorer 8 。この組み合わせでは SNI に対応しないのは知っていたのですが、デフォルト以外の SSL サイトへアクセスした場合、証明書のエラーは出るものの、実は参照しているドキュメントルートは正しいサイトのものであるという・・・。