TenForward

技術ブログ。はてなダイアリーから移転しました

ネームベースの VirtualHost で SSL/TLS (3)

の続編.ワイルドカード証明書や subjectAltName は,証明書側にそのような記述が必要なので,CAのポリシーによっては発行出来なかったりすることがあります.

RFC2817 は,まだブラウザが対応していないという問題があります.

で,また別の解決策として SNI (RFC3546, RFC4366) というものがあります.これは,RFC2817 と逆で,ブラウザ側で Firefox2, Opera, IE7 が対応していますが,Apache HTTP Server (mod_ssl) ではまだ正式対応されていないというものです (stoneでは実装済みApache + mod_gnutls でも実装済み).

今回は,この SNI を試してみました.

必要なもの.

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>