バーチャルドメインでSSLサーバを運用する

仕事がらみでバーチャルドメイン環境下でSSLを利用する必要が出てきたのでメモ。

前提

  1. 安価で
  2. 名前ベースのバーチャルホスト

つまりは「www.example.com」と「member.example.com」でどちらもSSLを利用したい場合、ドメインごとに証明書とっちゃうと値段が倍になるし管理もややこしいので、証明書は1契約でサブドメインはなんでも良いようにやりましょうという話です。

Apache+mod_sslのインストール

この辺はややこしくしません。yumやapt-getとかでさっくりインストール。とりあえず環境はCentOSなのでyumで。
(以下環境がCentOSの場合の話)

OpenSSLでキーと証明書の作成

$ sudo -s
# cd /etc/httpd/conf
# openssl genrsa -des3 -out ssl.key/[ドメイン名].key 1024
pass phrase: [パスフレーズの入力]

# openssl req -new -key ssl.key/[ドメイン名].key -out ssl.csr/[ドメイン名].csr
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:[都道府県]
Locality Name (eg, city) [Newbury]:[市区町村]
Organization Name (eg, company) [My Company Ltd]:[組織名]
Organizational Unit Name (eg, section) :[所属]
Common Name (eg, your name or your server's hostname) :[コモンネーム]
↑このコモンネームを通常「member.exmple.com」とかにするわけですが、今回はワイルドカードで「*.example.com」を入力
Email Address : 無視
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password : 無視
An optional company name []: 無視

という感じでキーと証明書をつくります。確認は以下コマンドで。

# openssl req -noout -text -in ssl.csr/[ドメイン名].csr
# openssl rsa -noout -text -in ssl.key/[ドメイン名].key

SSL証明書の取得

今回の目的は、「異なるサブドメインで共通の証明書を使う」ということで、ワイルドカード対応のSSL証明書を取得します。
調べた結果、「RapidSSL」が年間300ドル程度で取得できそうなのでこちらから申し込みを行いました。

申し込みフォームに作成したCSRの内容を入力する必要があるので、サーバで

$ sudo cat /etc/httpd/conf/ssl.csr/[ドメイン名].csr

した結果をコピーして貼り付けます。

また、契約するドメイン名もワイルドカードを使用して「*.[ドメイン名]」としておきます。

申し込み後1時間程度でメール連絡があり、入金後2,3日で利用開始の通知と共にCRTがメールで送られてきますので、コピーしてサーバ上に作成します。

$ sudo vi /etc/httpd/conf/ssl.crt/[ドメイン名].crt
※送られてきた内容を貼付

とりあえずこれで証明書関係の準備は完了ですので適宜サーバの設定を行います。

ApacehのSSLの設定

CentOSの場合、「/etc/httpd/conf.d/ssl.conf」にSSLの設定ファイルがありますが、バーチャルホスト関連の設定は、

  • conf.d/vhosts.conf
  • conf.d/vhosts_ssl.conf (SSL用)

で行いたいので、設定ファイル内の「」をすべてコメントアウトしておきます。
その上で、vhosts_ssl.confを編集します。

$ sudo vi /etc/httpd/conf.d/vhosts_ssl.conf
NameVirtualHost *:443
#

    ServerAdmin admin@[ドメイン名]
    DocumentRoot /home/www
    ServerName www.[ドメイン名]
    ErrorLog logs/www/error_log
    CustomLog logs/www/access_log combined env=!nolog

    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    SSLCertificateFile /etc/httpd/conf/ssl.crt/[ドメイン名].crt
    SSLCertificateKeyFile /etc/httpd/conf/ssl.key/[ドメイン名].key
    
        SSLOptions +StdEnvVars
    
    SetEnvIf User-Agent ".*MSIE.*" \
             nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0



    ServerAdmin admin@[ドメイン名]
    DocumentRoot /home/member
    ServerName member.[ドメイン名]
    ErrorLog logs/member/error_log
    CustomLog logs/member/access_log combined env=!nolog

    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    SSLCertificateFile /etc/httpd/conf/ssl.crt/[ドメイン名].crt
    SSLCertificateKeyFile /etc/httpd/conf/ssl.key/[ドメイン名].key
    
        SSLOptions +StdEnvVars
    
    SetEnvIf User-Agent ".*MSIE.*" \
             nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0

上記の例では、「www.[ドメイン名]」と「member.[ドメイン名]」でSSLを有効にしています。必要に応じて同じように設定をしてやれば追加できます。SSL以外でも利用できるようにするには、vhosts.confに記述します。

NameVirtualHost *:80


    ServerAdmin admin@[ドメイン名]
    DocumentRoot /home/www
    ServerName www.[ドメイン名]
    ErrorLog logs/www/error_log
    CustomLog logs/www/access_log combined env=!nolog

このように設定した場合、「www.[ドメイン名]」はhttpでもアクセスできますが、「member.[ドメイン名]」は「https://〜」でないとアクセスできないようになります。

あとはApacheを再起動し動作確認を行えば完了です。