1台のマシンでバーチャルホスト毎に別のSSL証明書を使用する方法
概要
ブラウザが https(SSL) リクエストを要求すると、最初に、 SSL 暗号化をセットアップするための証明書がブラウザに送られる。 これは要求する URL よりも先に行われるため、名前ベースのバーチャルホストを 選択することができない。
対策案
案1) クライアント側で別のポート(例: https://example.com:8443) にアクセスさせる。 =>かっこわるいので却下。
案2) FW で https://example.com へのアクセスを example.com:8443 に転送する。 => 使用している FW のマニュアルに
できるけどおすすめしないよ
と書いてあったので却下。
案3) IPアドレスベースのバーチャルホストを使用する。 => この方法が一般的とのこと。これを設定する。
設定内容
仮想IPアドレスの割り当て
一つのNICに2つのIPアドレスを割り当てる。
手順は以下。
使用中の IP アドレス
192.168.1.100
今回割り当てる仮想IPアドレス
192.168.1.101
まず、NIC の設定ファイルである
/etc/sysconfig/network-scripts/ifcfg-eth0
をコピーする。
# cd /etc/sysconfig/network-scripts/ # cp -p ifcfg-eth0 ifcfg-eth0:1 ← eth0の複製eth0:1を作成
次に、ifcfg-eth0:1を開いて編集する。
# vi ifcfg-eth0:1 ........................ DEVICE=eth0:1 ← eth0をeth0:1に変更 BOOTPROTO=static BROADCAST=192.168.1.255 HWADDR=00:11:AA:BB:CC:DD IPADDR=192.168.1.101 ← IPアドレスを変更 NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes
最後にifupで、仮想インターフェースを立ち上げる。
# ifup eth0:1
以上で、仮想IPアドレスが使用できるようになった。
証明書を2つ用意する
今回は自己証明書を2つ作成した。
- /usr/local/apache2/conf/vhost01_ssl/
- /usr/local/apache2/conf/vhost02_ssl/
それぞれのディレクトリ内で以下のコマンドを実行する。
秘密鍵の作成
# openssl genrsa -des3 -out server.key 1024
自己証明書の作成
# openssl req -new -x509 -days 365 -key server.key -out server.crt
Apache起動時のパスワード要求を解除
# openssl rsa -in server.key -out server.key
httpd.conf 設定
バーチャルホストの作成方法は省略。
- vhost01.example.com
- vhost02.example.com
という2つのサイトを作成した。
ポイントは以下の箇所。
バーチャルホストディレクティブの部分を
<VirtualHost *:80> ServerName vhost01.example.com 〜 以下略 〜
から、
<VirtualHost 192.168.1.100:80> ServerName vhost01.example.com 〜 以下略 〜
のように変更する。
同じように vhost02 も変更しておく。
変更前
<VirtualHost *:80> ServerName vhost02.example.com 〜 以下略 〜
変更後
<VirtualHost 192.168.1.101:80> ServerName vhost02.example.com 〜 以下略 〜
以上を設定し、Apache を再起動し、IPアドレスごとにブラウザアクセスできるようになったことを確認。
httpd-ssl.conf 設定
/usr/local/apache2/conf/extra/httpd-ssl.conf
を編集する。
httpd.confと同様にバーチャルホストディレクティブを編集する。
変更前
<VirtualHost _default_:443>
変更後
<VirtualHost 192.168.1.100:443>
また、ディレクティブの中でcrtとkeyの指定をする。
変更前
SSLCertificateFile "/usr/local/apache2/conf/server.crt" SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"
変更後
SSLCertificateFile "/usr/local/apache2/conf/vhost01_ssl/server.crt" SSLCertificateKeyFile "/usr/local/apache2/conf/vhost01_ssl/server.key"
同じように vhost02 用のディレクティブも追加する。
<VirtualHost 192.168.1.101:443> SSLCertificateFile "/usr/local/apache2/conf/vhost02_ssl/server.crt" SSLCertificateKeyFile "/usr/local/apache2/conf/vhost02_ssl/server.key"
Apache再起動
httpd.conf で httpd-ssl.conf が Include されていることを確認した後、 Apache を再起動する。
httpd.conf
Include conf/extra/httpd-ssl.conf
以上で、バーチャルホスト毎に個別のSSL証明書を使用されるようになる。
検証
ブラウザにて、
https://vhost01.example.com https://vhost02.example.com
にアクセスし、表示される証明書がそれぞれ作成したものになっていることを確認した。
以上。
参考・引用
Apache のSSL対応マルチドメイン設定の方法
http://platz.jp/howto/ssl_virtualhost.html
SSL自己証明書作成手順
http://www.pistolfly.jp/weblog/2008/09/macportsapache2ssl.html