の続編.ワイルドカード証明書や subjectAltName は,証明書側にそのような記述が必要なので,CAのポリシーによっては発行出来なかったりすることがあります.
RFC2817 は,まだブラウザが対応していないという問題があります.
で,また別の解決策として SNI (RFC3546, RFC4366) というものがあります.これは,RFC2817 と逆で,ブラウザ側で Firefox2, Opera, IE7 が対応していますが,Apache HTTP Server (mod_ssl) ではまだ正式対応されていないというものです (stoneでは実装済み,Apache + mod_gnutls でも実装済み).
今回は,この SNI を試してみました.
必要なもの.
- openssl 0.9.8f 以降
- Apache 2.2
- Apache 2.2 に対するパッチ (https://sni.velox.ch/ にあります)
openssl
openssl は TLS extension サポートで構築されている必要があります.主要な環境でサポートされているかどうかは知りません.ソースから構築する場合,
$ ./config enable-tlsext shared $ make depend $ make # make install
というように,config の引数に "enable-tlsext" を付加します.私は openssl-0.9.8g で試しました.
Apache HTTP Server の make
apache は 2.2.2 に対するパッチが https://sni.velox.ch/misc/httpd-2.2.2-sni.patch にあります.
2.2.6 でも,行のずれはありましたが,適用出来ました.
パッチを見ると,"#ifndef OPENSSL_NO_TLSEXT" のような記述がありますが,openssl が TLS extension 対応されていると,"OPENSSL_NO_TLSEXT" が定義されていないのだと思います.
パッチを当てたら,普通に mod_ssl を有効にして Apache HTTP Server を構築すれば OK です.
Apache HTTP Server の設定
普通に http でネームベースの VirtualHost を設定するのと同じです.サーバ名毎に証明書を指定します.
Listen 443 NameVirtualHost *:443 <VirtualHost *:443> SSLEngine On ServerName kirk:443 DocumentRoot /var/www/html/kirk SSLCertificateFile /etc/httpd/certs/kirk.crt SSLCertificateKeyFile /etc/httpd/private/kirk.key </VirtualHost> <VirtualHost *:443> SSLEngine On ServerName spock:443 DocumentRoot /var/www/html/spock SSLCertificateFile /etc/httpd/certs/spock.crt SSLCertificateKeyFile /etc/httpd/private/spock.key </VirtualHost>