SSL / 暗号化

name-based バーチャルホスト

度々言われていることですが,専用の IP アドレスを持たない name-based バーチャルホストでは SSL は利用できない,というのが定説です.これは, HTTP リクエストの Host ヘッダを読み込む前に SSL ハンドシェークを行わねばならず, リクエストされたホストに適合するサーバ証明書の選択が不可能なためです. もっとも,「証明書のドメイン名が一致しません」といったエラーがブラウザから 出ても構わないということなら,強引に使えないこともないですが.

この問題への一つの対応法としては RFC 2817 - Upgrading to TLS Within HTTP/1.1 のように,port 443 (HTTPS) でなく port 80 (HTTP) を用い,いったんクリアテキストで Host ヘッダ等を 渡した後に暗号化に切り替えるという方法も提案されていますが,HTTP サーバ側も ブラウザ側もこういう仕組みを実装しているものは現状ではあまり多くありません (Apache 2.2 の mod_ssl では実装されています).

一方,今ある仕組みで利用可能なものとしては,条件が限られますが ワイルドカード証明書ということになります.例えば,バーチャルホストが a.example.com, b.example.com, c.example.com のようにすべて example.com の配下にあるものならば,*.example.com という ドメイン名のサーバ証明書を利用すれば Ok です.ただし, 特定のドメイン配下のサブドメインのバーチャルホストでしか 利用できないという制約がある上,すべての認証局がワイルドカード証明書を 発行してくれるということでもないようです.

CAcert.org: フリー認証局

SSL を使った HTTP サーバを立ち上げる際には,当然サーバ証明書が必要となります. ちょっとしたテスト用なら自己署名証明書でも作ればいいんですが, ブラウザから認証局確認のダイアログが出てきてしまいますし, 実運用でもそれ押し通すのはなかなかできませんから,VeriSign なり Thawte なりと いったところから証明書を発行してもらうわけですが,費用が馬鹿になりません.

そこを何とか費用をかけずに証明書を入手できないものか,という願いに対する 一つの答えが CAcert.org です. 例えば,あるドメインの所有者であることの証明として,Whois の登録連絡先または そのドメインの hostmaster / Postmaster 等への E-mail に対し返信することにより, そのドメインに対する6ヶ月間有効な(非保証型)サーバ証明書を無償で入手することができます. さらに,CAcert Web of Trust 保証人に写真入り公的身分証明書を提示し 50 保証ポイントを得れば,2年間有効な保証型サーバ証明書を無償で入手可能です.

CAcert Web of Trust 保証人というのは CAcert.org 独自の保証システムで, その保証人の保持する保証ポイントの範囲内で,写真入り公的身分証明書を 提示した他者に保証ポイントを付与することができます.

とはいうものの,現状では IE / Mozilla といったメジャーなブラウザでは CAcert.org をデフォルトの信頼できる認証局として扱っていないため, その証明書では確認ダイアログが出てきてしまいます.これでは,証明能力は別として ユーザ側の使い勝手としては自己署名証明書と大差ない,ということになってしまいます. とりあえず IE はともかくとしても(とはいえ,何だかんだいっても現状では 最大シェアですから,入れてもらった方がいいには違いないですが),オープンソースの Mozilla などは何とかならんもんか,とも思うわけですが,そのうち何とかなるんですかね. Bug 215243 - CAcert root cert inclusion into browser