Name BaseのバーチャルホストでSSL
1台のWebサーバーに複数のバーチャルホストを稼働させている場合、
SSLを導入するにはどうするか、というのを調べたのでメモ。
できないといわれていたが、実はできる、という内容の記事がいくつかヒット。
2007年頃からパラパラと、という感じ。
このあたりを参考:
方法としては、とりあえず以下の3つ。
- ワイルドカード
- Subject Alternative Name(SubjectAltName)
- Server Name Indication(SNI)
ほかに、Upgrading to TLSというのもあるそうだが、
ブラウザの対応が進んでいないようなので、とりあえず除く。
以下のサイトに実験の記事があった。
で、引用させてもらったサイトにも書いてあるけど、
なんで方法がいくつかあるのか、ということについて。
SSLは、http通信を暗号化するんだけど、
http通信が始まる前にハンドシェイクというやり取りをして、
そのサーバーが信頼できるかどうかを確認する。
サーバー側にサーバー証明書が置いてあって、
ハンドシェイクのときにサーバーからクライアントへホスト名が送られるんだけど、
バーチャルホストを複数立てている場合、
リクエストされたホスト名がサーバー証明書のホスト名と違うことが考えられる。
ハンドシェイクが終わってhttp通信が始まったとき、
httpリクエストでHostのフィールドに記述されているホスト名が、
サーバー証明書のホスト名と食い違わないようにするためにはどうするか、という話になって、
それを回避する方法がいくつかある、と。
ワイルドカード
複数のバーチャルホストの名前の共通部分以外を「*」に置き換えたサーバー証明書にして、
Hostフィールドのホスト名との食い違いを回避する、というやり方。
という2つのバーチャルホストがあった場合は、
- *.hoge.jp
でサーバー証明書を発行する。
しかしながら、このやり方は規格があまりきちんとしていないらしく、
どこまでワイルドカードが使えるのかがブラウザによって違う。
このあたりを参照:
規格がはっきりしてないからか、
ベリサインはワイルドカードのサーバー証明書を扱っていない。
グローバルサインはワイルドカードオプションというのがあるそうで。
CSP SSLもWildcardという製品がある。
Subject Alternative Name(SubjectAltName)
こちらを参照:
SSL? 証明書? PKI? それっておいしいの?: RFC 5280 の 4.2.1.6. Subject Alternative Name
サーバー証明書のホスト名に別名を複数指定できる、という感じですか。
これは規格がはっきりしているようですが、
ワイルドカードとの違いとして意識しておく点としては(あたり前なんでしょうけど)、
証明してもらうホスト名がはっきり決まっている、ということ。
ワイルドカードのルールは関係ないので、どんな名前でもいいのだけれど、
新しいホストを追加する場合は、証明書は取り直す。
これもベリサインは扱っていなかった。
(商品の説明を見てもわからなかったので、問い合わせて確認。)
グローバルサインは、イントラネット・オプションをつけるとか。
3月2日訂正:
このオプションはその名前の通り、プライベートなネットワーク内の名前しかサポートしていないとのこと。
外向けに公開されているバーチャルホスト用の、
Subject Alternative Nameに対応した証明書は扱っていない。
CSP SSLはMulti-Domain Certificatesというので3ドメイン以上から。
Server Name Indication(SNI)
Security(TLS) Extensions(RFC4366)の3.1で定義。
今のところこれが本命という感じですか。
ハンドシェイクの段階で、クライアントがホスト名を伝える、というもの。
この場合は、証明書で対応するのではなく、
Webサーバーとクライアントが対応している必要がある。
なのでホストごとに証明書を取得するから、認証局はどこでもよさそう。
Apacheの構成としては以下。
- バージョン2.2.12以上(2009年7月頃?)
- OpenSSL 0.9.8f以降
クライアントは、
- Firefox 2.0以上
- Internet Explorer 7.0以上
- Opera 8.0以上
- Safari 3.2.1以上
Google Chromeは3.0.195.38では対応が確認されているらしい。
ただし、OSの制限もあるそうで、
Win XPでは、OperaとFirefox以外は上記のバージョンでもダメとか。
対応していないクライアントからアクセスした場合、
サーバー側に指定してある最初のバーチャルホストに飛ばされる、とか。
詳細はこちらを参照: