マルチドメインでSSLを1ドメインだけで利用しているときの注意ポイント
複数のドメインを1つのIPアドレスで運用し、その中の1ドメインだけでSSLを使っているケースって多いと思うのですが、そのような場合に、SSLのデフォルト設定をしておかないと、大変なことになるというお話です。
名前ベースのバーチャルホストを設定している場合
NameVirtualHost 192.51.100.57:80 NameVirtualHost 192.51.100.57:443 <VirtualHost 192.51.100.57:80> ServerName www.example.com DocumentRoot /var/www/www.example.com/htdocs </VirtualHost> <VirtualHost 192.51.100.57:443> ServerName www.example.com DocumentRoot /var/www/www.example.com/htdocs SSLEngine on SSLCertificateFile /etc/apache2/ssl/example.crt SSLCertificateKeyFile /etc/apache2/ssl/example.key </VirtualHost> <VirtualHost 192.51.100.57:80> ServerName www.example2.com DocumentRoot /var/www/www.example2.com/htdocs </VirtualHost>
こんな感じで設定することが多いと思うのですが、この設定だけだと、https://www.example2.com/ をはじめとする未定義のホストにアクセスすると、/var/www/www.example.com/htdocs の内容が表示されてしまいます。これだと何かと都合が悪い(重複コンテンツになってしまいますし)ので、以下のように、デフォルトの設定を最初に加えておくことをおすすめします。
NameVirtualHost 192.51.100.57:80 NameVirtualHost 192.51.100.57:443 <VirtualHost 192.51.100.57:80> ServerName dummy CustomLog /var/log/apache2/access_log combined DocumentRoot /var/www/dummy <Directory /var/www/dummy> Options -Indexes Order allow,deny allow from all </Directory> </VirtualHost> <VirtualHost 192.51.100.57:443> ServerName dummy CustomLog /var/log/apache2/access_log combined DocumentRoot /var/www/dummy <Directory /var/www/dummy/> Options -Indexes Order allow,deny allow from all </Directory> SSLEngine on SSLCertificateFile /etc/apache2/ssl/example.crt SSLCertificateKeyFile /etc/apache2/ssl/example.key </VirtualHost> <VirtualHost 192.51.100.57:80> ServerName www.example.com DocumentRoot /var/www/www.example.com/htdocs </VirtualHost> <VirtualHost 192.51.100.57:443> ServerName www.example.com:443 DocumentRoot /var/www/www.example.com/htdocs SSLEngine on SSLCertificateFile /etc/apache2/ssl/example.crt SSLCertificateKeyFile /etc/apache2/ssl/example.key </VirtualHost> <VirtualHost 192.51.100.57:80> ServerName www.example2.com DocumentRoot /var/www/www.example2.com/htdocs </VirtualHost>
あとは、/var/www/dummy を作っておけばOKです。これで、https://www.example2.com/ にアクセスしてきた場合には、Not Found が返るようになります。Forbidden を返したければ
NameVirtualHost 192.51.100.57:80 NameVirtualHost 192.51.100.57:443 <VirtualHost 192.51.100.57:80> ServerName dummy <Location /> Order deny,allow Deny from All </Location> </VirtualHost> <VirtualHost 192.51.100.57:443> ServerName dummy <Location /> Order deny,allow Deny from All </Location> SSLEngine on SSLCertificateFile /etc/apache2/ssl/example.crt SSLCertificateKeyFile /etc/apache2/ssl/example.key </VirtualHost> 以下略
こんな感じに。
通常の80番ポートのほうは、取得したドメインの数だけホストの設定をすることが多いので、デフォルトの設定をしなくてもあまり問題が生じないのですが、443番のほうは逆に https を使わないホストについて設定することがほぼないと思います。それゆえにデフォルト設定が重要というわけです。
ホストごとに設定ファイルを分けている場合(「001-example.com」みたいに)には、「000-default」のように、デフォルト設定が一番最初に読み込まれるようにファイル名を調整してください。