Name BaseのバーチャルホストでSSL

1台のWebサーバーに複数のバーチャルホストを稼働させている場合、
SSLを導入するにはどうするか、というのを調べたのでメモ。


できないといわれていたが、実はできる、という内容の記事がいくつかヒット。
2007年頃からパラパラと、という感じ。
このあたりを参考:

仙石浩明の日記: stone に Server Name Indication (TLS 拡張) 機能を実装


方法としては、とりあえず以下の3つ。


ほかに、Upgrading to TLSというのもあるそうだが、
ブラウザの対応が進んでいないようなので、とりあえず除く。
以下のサイトに実験の記事があった。

Upgrading to TLS(RFC2817)の設定をApache2.2にしてみる|でびぞー徒然日記


で、引用させてもらったサイトにも書いてあるけど、
なんで方法がいくつかあるのか、ということについて。


SSLは、http通信を暗号化するんだけど、
http通信が始まる前にハンドシェイクというやり取りをして、
そのサーバーが信頼できるかどうかを確認する。
サーバー側にサーバー証明書が置いてあって、
ハンドシェイクのときにサーバーからクライアントへホスト名が送られるんだけど、
バーチャルホストを複数立てている場合、
リクエストされたホスト名がサーバー証明書のホスト名と違うことが考えられる。
ハンドシェイクが終わってhttp通信が始まったとき、
httpリクエストでHostのフィールドに記述されているホスト名が、
サーバー証明書のホスト名と食い違わないようにするためにはどうするか、という話になって、
それを回避する方法がいくつかある、と。

ワイルドカード

複数のバーチャルホストの名前の共通部分以外を「*」に置き換えたサーバー証明書にして、
Hostフィールドのホスト名との食い違いを回避する、というやり方。

という2つのバーチャルホストがあった場合は、

サーバー証明書を発行する。
しかしながら、このやり方は規格があまりきちんとしていないらしく、
どこまでワイルドカードが使えるのかがブラウザによって違う。
このあたりを参照:

SSL/TLS で Namebase のバーチャルホスト

規格がはっきりしてないからか、
ベリサインワイルドカードサーバー証明書を扱っていない。


グローバルサインはワイルドカードオプションというのがあるそうで。

ワイルドカード | SSLサーバ証明書 |GMOグローバルサイン【公式】


CSP SSLもWildcardという製品がある。

CSP SSL

Subject Alternative Name(SubjectAltName)

こちらを参照:

SSL? 証明書? PKI? それっておいしいの?: RFC 5280 の 4.2.1.6. Subject Alternative Name

サーバー証明書のホスト名に別名を複数指定できる、という感じですか。
これは規格がはっきりしているようですが、
ワイルドカードとの違いとして意識しておく点としては(あたり前なんでしょうけど)、
証明してもらうホスト名がはっきり決まっている、ということ。
ワイルドカードのルールは関係ないので、どんな名前でもいいのだけれど、
新しいホストを追加する場合は、証明書は取り直す。


これもベリサインは扱っていなかった。
(商品の説明を見てもわからなかったので、問い合わせて確認。)


グローバルサインは、イントラネット・オプションをつけるとか。

http://jp.globalsign.com/service/ssl/option/intranet.html


3月2日訂正:
このオプションはその名前の通り、プライベートなネットワーク内の名前しかサポートしていないとのこと。
外向けに公開されているバーチャルホスト用の、
Subject Alternative Nameに対応した証明書は扱っていない。




CSP SSLはMulti-Domain Certificatesというので3ドメイン以上から。

CSP SSL

Server Name Indication(SNI)

Security(TLS) Extensions(RFC4366)の3.1で定義。
今のところこれが本命という感じですか。
ハンドシェイクの段階で、クライアントがホスト名を伝える、というもの。
この場合は、証明書で対応するのではなく、
Webサーバーとクライアントが対応している必要がある。
なのでホストごとに証明書を取得するから、認証局はどこでもよさそう。


Apacheの構成としては以下。

  • バージョン2.2.12以上(2009年7月頃?)
  • OpenSSL 0.9.8f以降


クライアントは、

Google Chromeは3.0.195.38では対応が確認されているらしい。
ただし、OSの制限もあるそうで、
Win XPでは、OperaFirefox以外は上記のバージョンでもダメとか。


対応していないクライアントからアクセスした場合、
サーバー側に指定してある最初のバーチャルホストに飛ばされる、とか。


詳細はこちらを参照:

ウェブブラウザのSNI対応 | dodaの日記 | スラド