1IPしかないサーバーで複数のSSLを設定する [Ubuntu 12.04]


こんにちは。最近あんまり良いことが無い趣味レベルのインフラ構築が好きな大野です。
時代は 1IP = 1SSL では無くなっていた
恥ずかしながらウェブ業界でそこそこ長いことやっているにも関わらず、今までまじめにSSLに取り組んだことが無く、1IP=1SSLってずーっと思い込んでいたが、実は1IPで複数のSSL証明書に対応できることを知って軽くカルチャーショックを受けながら、社内で使用しているサイトにSSLを設定するついでにメモ。
Apache 2.2.12以降なら導入可能
Apache 2.2.12 以降ならSNI(Server Name Indication)と言う仕組み対応していて、複数のSSL証明書に対応することができるそう。Ubuntu 12.04 LTSに入っているApacheは 2.2.22 なので問題無い。
詳しくは下記の記事が参考になる。
Apacheの設定を変更し、単一IPアドレス上で複数のSSLサイトを運用する - builder by ZDNet Japan
だがしかしブラウザ対応が
どうやらSNIと言う仕組みにユーザーが使用するブラウザが対応していないとダメらしい。よく見てみるとFireFoxとかはかなり昔から対応しているのに Internet Explorer については、なんとIE7以降からの対応である。これが1IP=1SSLと言われる所以か。今回導入するサーバーは社内向けのサーバー・サービスなので全く問題ないが、2013年の現在となっても未だに憎きIE6は絶滅していないので、案件によってはクライアントとよく相談しないとまずいね。
VirtualHostでSSLを使えるようにする
/etc/apache2/ports.conf の ディレクティブに NameVirtualHost *:443 を追加する。
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
Listen 443
NameVirtualHost *:443 # これを追加
これを追加しないとApacheの起動時にこんなエラーメッセージが発生する。
[warn] _default_ VirtualHost overlap on port 443, the first has precedence
後はサイトの設定ファイルに通常のVirtual Hostにポート番号を443にしたのディレクティブを作成するだけでOK。
ServerName a.example.com
DocumentRoot /var/www/a.example.com
Order deny,allow
Deny from all
Allow from 192.168.0.0/24
# SSL
SSLEngine on
SSLCertificateFile /etc/ssl/a.example.pem
SSLCertificateKeyFile /etc/ssl/a.example.key
ServerName b.example.com
DocumentRoot /var/www/b.example.com
Order deny,allow
Deny from all
Allow from 192.168.0.0/24
# SSL
SSLEngine on
SSLCertificateFile /etc/ssl/b.example.pem
SSLCertificateKeyFile /etc/ssl/b.example.key