なーお さんの日記
用途
1つのグローバルIPアドレスと1台のサーバーでApacheの「名前ベースVirtualホスト」で複数ドメインを運営している場合などで、SSLサイトをいくつか稼動させたいと思っても、簡単にはできませんでした。
なぜなら、この場合のサイト証明書はIPアドレス別かポート別にしか有効に機能しないからで、その理由はHTTPSヘッダーに「どのサイトのサーバー証明書を要求するか」が含まれなかったためです。
ところが、実は2003年に「Transport Layer Security (TLS) Extensions」として、これを拡張する規格が発表されていたのです。。 そしてようやく、FireFox2+、WindowsVista上のIE7やOPERA8+でブラウザ側の対応も徐々に進行している模様。
で、サーバー側の状況はどうかというと、↓のサイト
名前ベースのVirtualHostでそれぞれのSSLサーバ証明書を使う で書かれている3つの方法があるらしい。
その中で一番スマートな、「Server Name Indication (SNI)を使う」方法にチャレンジしてみました。
参考サイト
A: url=http://seclan.dll.jp/dtdiary/2007/dt20071015.htm]OpenSSL 0.9.8f で tls extension の SNI (Server Name Indication、サーバ名指示) 拡張が利用可能に![/url] → 下のstoneのページではOPENSSL-0.9.9以上が必要と書かれていますが、これはまだ公開されていなくて諦めかけていたとき、この0.9.8f以降でOKという情報を知り再開しました。
B: stone に Server Name Indication (TLS 拡張) 機能を実装 → stoneの作者の方の、開発ブログです。全面的に参考になります。
C: simple repeater 'stone'
接続概念図
stoneは、リバースプロクシとして物理マシン上で動かします。 ADSLモデムルーターのhttpsポートだけを物理マシン向けに変更し、そこで要求先URLに応じてDNSから得たIPアドレスに転送します。
本当はstoneを使えばIPベースにする必要がないのですが、今回は勉強の意味もありそうしています。
準備
1、Linuxマシン(自分は仮想マシンだけど)に、仮想NICを追加しておきます。 eth0:1、eth0:2 の2つ。。Webminで安直にやりましたんで、省略。
2、HTTPサーバーの各SSLサイトのディレクティブを、名前ベース→上記で作成したIPベースに変更。
内部DNSの各SSLサイト用のレコードを上記IPアドレスに変更。
3、使用する各SSLサーバー証明書の作成。
この辺を参考に→SSLでセキュアなWebサイト - 鍵の作成とサイト証明書 証明書ファイルと暗号化キーファイルを作成します。 今のところ「オレオレ証明書」でアラートが出ますが、指定認証局に認証してもらえば、正式な証明書として使えます。
そして、/usr/local/ssl/certs/以下に 証明書ファイルを「ドメイン名-cert.pem」 キーファイルを「ドメイン名-key.pem」として保存しておきます。
インストール
1、OPENSSLの最新版をインストール
(参考サイトA) 「SNI」を使えるOPENSSLライブラリが、OPENSSL-0.9.8f以降にバックポートされて公開されています。 そのインストール時に「enable-tlsext」オプションを指定します。
また、私の場合(VineLinux-4.1)0.9.7-0vl2がインストールされていましたが、これはそのまま残しておいて別にインストールします。
1 2 3 4 5 6 7 8 |
|
2、stoneのインストール
(参考サイトB)
上で作ったOPENSSLのライブラリをインクルードしてコンパイルします。
1 2 3 4 5 6 7 8 9 |
|
(上のエラーを回避しようとしましたが、今のところそのままでも動いています。)
実行
1 2 3 4 5 |
|
これだけです。
実際は調査も含め、数日かかりましたが。
確認
1、まずはOPENSSLのクライアント機能を使い、サーバー上でコマンドで確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
↑のように、接続指定したドメイン毎に、夫々の証明書が返ってきたら成功です!
2、ブラウザから接続
最後に外部からの接続確認です。
繰り返しになりますが、ブラウザはFireFox2+、WindowsVista上のIE7やOPERA8+でしか対応されていません。 (XP上のIE7でもだめらしい・・)
私は普段からFireFoxを使っていますので、そのまま確認できました!
**
以上、だいぶ端折りましたけれども、今までなかなか出来なかったことができるようになると、嬉しいですね!