さくらVPSのCentOS6にRapidSSLのワイルドカードを導入

ちょっとしたWebのサービスを作成していて、SSLを導入しないとなぁと思っていたのですが、本番稼働に向けてようやく導入することにしました。

 

サブドメインで別サイトも構築中で、そちらでもSSLを使用したいしVPSを使っていてIPアドレスが追加できないのでワイルドカードのSSLを導入しました。

RapidSSLは1万円くらいから選べますが、それ以外のワイルドカードは高すぎて予算的に無理。

というわけでRaipdSSLのワイルドカードを導入した時の記録です。

いや、放置してたら後で絶対忘れちゃうから。

 

参考にしたサイトはいくつかあるのですが、現在見れるサイトを2つ貼っておきます。

http://fuminori14.hatenablog.com/entry/20120930/1348985830

http://gomojp.blog77.fc2.com/blog-entry-148.html

もう一つ非常に参考になったサイトがあったんですが、なぜか見れなくなっていて残念。

 

サーバーはCentOS6、Apache2.2です。

すでにバーチャルホストが動いていて、そこにSSLを追加するという状況です。

手順はSSL証明書を購入した会社によるので同じかどうかは分かりませんが、私の場合はこうでした。

  1. mod_sslを導入
  2. 秘密鍵を作る
  3. CSRを作成  <- Common Nameを *.ドメイン名にする
  4. SSLを申し込みして、作成したCSRを送る
  5. 承認メールが送られてくるので、メールに記載されているURLを開いて、承認ボタンを押す
  6. メールでサーバー証明書と中間証明書が送られてくるので、コピペでサーバーにファイルをそれぞれ作成
  7. ApacheにSSLのバーチャルホストの設定追加
  8. iptableの設定変更
  9. Apache再起動

1. mod_sslの導入はyumを使って一発で終了

 yum install mod_ssl 

 

2. 秘密鍵の作成です

/etc/pki/tls/certs/にあるMakefileを使っても良いのですが、中を見れば同じコマンドって事で


# cd /etc/pki/tls/certs
# openssl genrsa -aes256 2048 > server.key
Generating RSA private key, 2048 bit long modulus
.............................................+++
......+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:  <- ここにパスフレーズを入力

今回はaes256にしましたが、Makefileはaes128になっています。
ここは趣味の問題かと。

 

3. 次に、CSRを作成

ポイントは、ワイルドカードの場合*.ドメイン名にするということです。

出力ファイル名はserver.csrにしました。

# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []: <- 県を入力
Locality Name (eg, city) [Default City]: <- 市を入力
Organization Name (eg, company) [Default Company Ltd]: <- 会社名を入力
Organizational Unit Name (eg, section) []: <- 部署名を入力(例えばSYSTEMとか)
Common Name (eg, your name or your server's hostname) []: *.ドメイン名を入力
Email Address []: <- メールアドレスを入力

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:An optional company name []:

 

4. SSL証明書を購入して、CSRを送信

ここは証明書を購入したサイトによって違うのでやり方は様々です。

要するに作成したCSRをコピペしてあげれば良いので、catで表示してコピペします。

 # cat server.csr 

 

5. RapidSSLから「RapidSSL Wildcard Certificate Request Confirmation」
という件名のメールが送られてきました。
このメールのリンクをクリックすると、注文を承認するかどうかの画面が表示されます。
当然承認すると、6. サーバー証明書と中間証明書 がメールで送られてきます。

 

6. メールに添付されてきた証明書をサーバーに設置

サーバー証明書はserver.crt、中間証明書はserver-chain.crtという名前で保存することにします。

# vi server.crt
# vi server-chain.crt

 

7. Apacheの設定

mod_sslをインストールすると、/etc/httpd/conf.dにssl.confができます。

これをコピーして、vh-ドメイン名_ssl.confという名前にしておきます。

バーチャルホストを使用するので、ssl.confでバーチャルホストの設定を削除します。

ということで、<VirtualHost _default_:443>以下をザックリ削除。

続いてvh-ドメイン名_ssl.confを編集します。

こっちの方は<VirtualHost _default_:443>より前をザックリ削除して

<VirtualHost *:443>
DocumentRoot サブドメインのDocumentRoot
ServerName サブドメイン:443

ErrorLog  SSLエラーログ出力先
TransferLog SSLアクセスーログ出力先
LogLevel warn

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/certs/server.key
SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>

SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

といった風に一部だけ変更して保存します。

 

8. iptableでポート443に穴を空けます。

/etc/sysconfig/iptables

に1行追加


-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443    -j ACCEPT

そのあと、iptableを再起動


/etc/init.d/iptables restart

 

9. Apache再起動


/etc/init.d/httpd restart

でApacheを再起動します。

秘密鍵のパスフレーズを聞かれるので、入力したら再起動されてきます。

 

 

ここまで設定して何点か問題があったので更に修正。

 

その1

NameVirtualHost *:443

をApacheのSSL設定のどこか1カ所に書いておかないと
[warn] _default_ VirtualHost overlap on port 443, the first has precedence

というログがでます。

ssl.confの一番最後に


NameVirtualHost *:443

を1行追加しました。

 

その2

sslでも.htaccessをoverrideさせるためには、SSLの設定ファイルに


<Directory "ディレクトリ">
AllowOverride All
</Directory>

などの設定を追加する必要があります。

vh-ドメイン名_ssl.confに追加しました。

 

その3

Apacheの起動時にパスフレーズを必ず聞いてきます。

このままだと再起動時にWebサーバーが自動で起動しません。

対処方法としては、

1. 秘密鍵からパスフレーズを抜く

2. パスフレーズをテキストに保存しておいて、起動時に読み込ませる。

の2つがありますが、今回採用したのは2の方です。


vi pp-filter

で/etcかどこかにpp-filterというファイルを作成して


#!/bin/sh
echo "パスフレーズ"

という内容で保存します。


chmod 500 pp-filter

で実行フラグを立てるのを忘れずに。

さらに、ssl.confの設定を1行変更します。


#SSLPassPhraseDialog  builtin
SSLPassPhraseDialog exec:/etc/pp-filter

builtinをコメントにして、execでpp-filterを指定します。

これでもう一度Apacheを再起動してみるとパスフレーズを聞かれずに起動してきます。

 

サイトをIE6、8、Firefox、chrome、iphone5のsafariでhttpsから見ても問題ありません。

作業はさほど大変ではないのですが、文章に起こすとやたら長くなります。

 

自前でSSL証明書を準備すると、割と安くあがるのでがんばってみる価値はあると思います。