Apacheを使いながら複数のドメイン名のSSL証明書を用意する場合、もう一つIPアドレスが必要とよく言われる。しかしネットワーク資源的にも、やはりSSLは何とか使いまわせるととても嬉しい。さて、この件について何が駄目で問題になっているか。HTTPのサービスをVirtualhostにて提供する場合には
NameVirtualhost hogehoge:80 <Virtualhost hogehoge.com:80> ... </Virtualhost> ... NameVirtualhost foofoo.com:80 <Virtualhost foofoo.com:80> ... </Virtualhost>
と書く。通常のHTTP (ポート80番指定) の場合にはこのように。HTTPS (ポート443番指定) 指定の場合には一応Virtualhostの機能は機能しそうに思う。が、できない。理由は名前ベースにてVirtualhostディレクティブを記述した場合には、振り分けに使うHTTPのHOSTヘッダが取得できずに振り分けをすることができない。そのため、Virtualhostディレクティブ内の情報は無視されてしまう。HTTPSのVirtualhostを提供する場合にはIPアドレス指定にて記述する事となり、新規のIPアドレスが必要になる。
NameVirtualhost 192.168.0.1:443 <Virtualhost 192.168.0.1:443> ... </Virtualhost> ... NameVirtualhost 192.168.0.2:443 <Virtualhost 192.168.0.2:443> ... </Virtualhost>
このように書く事となる。因みに、
NameVirtualHost *:443 <Virtualhost *:443> ServerName hogehoge.com ... </Virtualhost> ... <Virtualhost *:443> ServerName foofoo.com ... </Virtualhost>
で、いけなくはない。ただし、Virtualhostのディレクティブ内に設定した証明書はApacheにて最初に指定された証明書を使う。恐らくは後者のホスト名についてはこの例のfoofoo.comにて正常なアクセスが出来なくなる(証明書エラー)。これが正常なSSLアクセスを提供出来なくなるもう一つの理由。その為、複数のSSLを一つのIPで提供するのであれば、
<Virtualhost 192.168.0.1:443> ... <Virtualhost> ... <Virtualhost 192.168.0.1:444> ... <Virtualhost>
のような、もはや当たり前の苦肉の策になる。そして、これは証明書のエラーこそ発生しないが、通常のブラウザでのアクセスの場合はポート指定が必要となりサービスを受けるユーザにはあまりよろしくない。今更このような話を書いて何が言いたいか。HTTPSを使用する際の一つのIPに対して証明書が一つの問題は、HTTPSの仕様によるホスト名からのApacheの証明書の切り替えが出来ない事と、同時に設定した場合には片方の証明書しか有効にならないことである。SSL証明書発行の際には名前だけしか見てはいない。しかし、Apacheの処理上、IP一つとどうしても絡んでしまうのだ。同僚とそのような話をして、結論はポート分けてしか提供ができないって事で収まりはしたが、HTTP同等の名前ベースでのVirtualhost分けを前提に会話するという超テキトウな説明をして猛省中。