まいける's Tech Blog

LAMP関係のメモなどを不定期に掲載します

マルチドメインで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」のように、デフォルト設定が一番最初に読み込まれるようにファイル名を調整してください。