2007年7月4日

名前ベースのVirtualHostでそれぞれのSSLサーバ証明書を使う

#なんだかんだしてたら、半月経ってしまった
#来週になったら、ちゃんと再開

Name-based SSL virtual hosts』 より

名前ベースのVirtualHostでSSLを使う場合、以下の方法をとれば、それぞれのVirtualHostごとの証明書を使うことができます。


  • ワイルドカード証明書を使う
CN=*.example.com という設定の証明書を使えば、www1.example.com と www2.example.com で共通のサーバ証明書を使うことができます。

  • subjectAltNameを使う
証明書の subjectAltName に別名としてVirtualHostのDNS名を書いておきます。サーバにセットする証明書は1つですが、証明書内の別名をチェックすることで、「証明書に書かれているホスト名と違う」といったエラーが出なくなります。欠点としては、VirtualHostが増えるたびに証明書を再発行する必要があることです。

  • Server Name Indication (SNI)を使う
この方法が一番自然。共有サーバでも使えるはずです。

TLSに対する拡張仕様であり、RFC 3546で規定されています。TLSのネゴシエーションの最初に、クライアント側から「ClientHello」を投げるのですが、このタイミングで、接続しようとしているホスト名を教えてあげます。これにより、サーバ側は、どのサーバ証明書をクライアントに返せばよいかを知ることができます。

SNIをサポートしているクライアントは、Opera、IE7、Firefox 2 です。

SNIをサポートしているWebサーバは、今のところapache限定で、mod_gnutlsやmod_ssl(+ experimental patch) だけです。但し、どちらも実験バージョンであり、安定バージョンではありません。なお、仙石さんのstoneがSNIをサポートしたようですので、stoneを経由させることで、他のWebサーバでもSNIを使うことができるようになるようです。

以下、Firefox2によるTLSネゴシエーションを見るために、opensslで仮のサーバを起動して、Firefoxから、このサーバ(https://www.example.com/)に接続してみます。手元のブラウザは、Firefox 2.0.0.4 です。

$ sudo openssl s_server -tls1 -cert /etc/pki/tls/certs/server.crt -key /etc/pki/tls/private/server.key -msg -accept 443
Using default temp DH parameters
ACCEPT
<<< TLS 1.0 Handshake [length 00af], ClientHello
01 00 00 ab 03 01 00 05 80 64 27 9f 68 a5 6d 30
5a a6 05 c3 86 46 ab 36 e1 ef de 83 aa 78 00 e6
ba ad c4 9f 34 fb 20 c1 e0 69 6c 3f 02 36 3b 85
43 b7 93 23 be 31 41 72 92 43 b7 e2 32 57 f8 af
a0 ad bc ad b9 97 81 00 38 c0 0a c0 14 00 39 00
38 c0 0f c0 05 00 35 c0 07 c0 09 c0 11 c0 13 00
33 00 32 c0 0c c0 0e c0 02 c0 04 00 04 00 05 00
2f c0 08 c0 12 00 16 00 13 c0 0d c0 03 fe ff 00
0a 01 00 00 2a 00 00 00 14 00 12 00 00 0f 77 77
77 2e 65 78 61 6d 70 6c 65 2e 63 6f 6d 00 0a 00
08 00 06 00 17 00 18 00 19 00 0b 00 02 01 00
>>> TLS 1.0 Handshake [length 004a], ServerHello
02 00 00 46 03 01 46 70 8f b7 94 95 96 e4 18 65

ClientHelloにおけるデータの後半部分の「77 77 77 2e 65 ...」が、www.example.comです。

0 コメント:

自己紹介

自分の写真
Takayuki Nakamura
日立ソフト、三井物産、三井物産セキュアディレクション、ユービーセキュアを経て、現在、シスコシステムズに勤務しています。情報セキュリティのコンサルを6年ほどやってましたが、何故か今はネットワークエンジニアをやってます。
詳細プロフィールを表示

ブログ アーカイブ