こんにちは。最近あんまり良いことが無い趣味レベルのインフラ構築が好きな大野です。

時代は 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