#来週になったら、ちゃんと再開
『Name-based SSL virtual hosts』 より
名前ベースのVirtualHostでSSLを使う場合、以下の方法をとれば、それぞれのVirtualHostごとの証明書を使うことができます。
- ワイルドカード証明書を使う
- subjectAltNameを使う
- 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 コメント:
コメントを投稿