名前ベースのVirtualHostでHTTPSサービス

VHostついでにこのネタも。

結論から言って、名前ベース(言う時はネームベースと言うかな)のVirtualHost環境のそれぞれのドメイン名で個別のSSL証明書を使い分けることはできない。

理由は簡単。名前ベースのVirtualHostはクライアントから飛んでくるHTTPリクエストヘッダ内のHost:ヘッダを使って、どのVirtualHostへのアクセスなのかを判断しているから、なんです。

HTTPS通信はHTTPSセッション確立の時にすでに証明書が必要だから、HTTPセッション確立後にやりとりするヘッダで対象ドメイン名を切り替える必要がある名前ベースのVirtualHostは原理的に不可能なのです。

逆に名前ベースでなくIPアドレスベースのVirtualHostであれば可能。HTTPSセッション確立時にHost:ヘッダは取れないけど、どのIPアドレスに対するアクセスかは判別可能だから、IPアドレスを基準に証明書を選ぶことが出来る。そのかわりVirtualHostでHTTPS通信を行いたいドメインの数だけIPアドレスが必要だから現実的ではない、というわけ。

HTTPSが使えます!という共有型Webホスティングサービスが(多分)ないのはこういう理由なのでした。