2019年1月17日

さくらVPSでSSL設定

長年の懸案というかあえて放置していたサーバのSSL設定を行ったので個人的な覚書として記録しておきます。まず、何故これまで放置していたのかというと個人的にはSSL化する必要性を感じなかったからです。運用しているネットアプリは災害などの緊急時に病院での救急隊員やその他スタッフの集合要請をかけるとシステムです。その性格上、SSLとか関係なしにとにかく継続的に運用できることが第一です。最近ニュースになっていましたが最後までポケベルを使っていたのは病院関係者だったそうです。24時間365日障害なく動いてくれればいいのだから保守する人がいなくても動いてくれるポケベルは使い勝手が良かったのだろうと妙に納得しました。ただ、今の時代はそんなことも言ってられません。私が引き継ぐ前の開発者がSSLの導入を途中でやめていたようなのでおそらく当初からSSLを入れる予定だったのでしょうが、私は開発サーバもない環境で自分の技術力不足からシステムが運用できなくのはリスクだと考え、SSL化を固辞してきました。また、SSL化しても引き継ぎが上手くいかなければ将来的にシステムが使えなくなる可能性も危惧していました。しかし、やはり今時SSL化していないネットアプリは信用がおけない(=売れない)ということで遅ればせながらSSLを導入して、httpへのアクセスをhttpsへリダイレクトすることにしました。

対象となるのは異なるサブドメインをもつ2つのサイトです。ここでは、aaa.example.co.jp と bbb.example.co.jp としておきましょう。サーバはさくらのVPS 2Gで

Server version: Apache/2.2.15 (Unix)
CentOS release 6.10 (Final)

となっています。SSL導入に必要な mod_ssl と openssl は既に入っていました。
yum list installed | grep mod_ssl
yum list installed | grep openssl
で確認してなければ、
yum install mod_ssl
yum install openssl
でインストール。参考にしたサイトは以下のURLです。

さくらVPSへのSSLの導入

とくにサーバ環境が似ていた最初のURLがとても参考になりました。sudoの使えるアカウントでログインして、以下のコマンドを実行していきます。

cd /etc/httpd/conf
sudo mkdir ssl.key
cd ssl.key
sudo openssl genrsa -des3 -out server.key 2048
Enter pass phrase for server.key:
*******(適当なパスワードを設定)
*******(確認のためリタイプ)
cd /etc/httpd/conf
sudo mkdir ssl.csr
sudo openssl req -new -key ssl.key/server.key -out ssl.csr/server.csr
*******
上記のパスワードを入れると住所など聞かれるので記入する。Common Nameに入れるドメイン名 aaa.example.co.jp を間違えないように注意しましょう。

cat ssl.csr/server.csr
-----BEGIN CERTIFICATE REQUEST-----
................................(以下省略)...............................
.............................................................................
.............................................................................
................
-----END CERTIFICATE REQUEST-----

でファイル確認。ここまで準備ができたら、


でSSL証明書を購入。一番安いJPRS ドメイン認証型(1年)にしました。申し込みの際に上記のserver.csrファイルの文字列が必要になります。申請後、会員メニュー


で確認すると、問題がなければ(ドメインが通っていれば)認証テキストファイルをダウンロードできます。そのファイルを
aaa.example.co.jp/.well-known/pki-validation/
以下に配置すれば、自動でサーバを確認してくれます。15分ほどかかりますが、問題がなければ前回同様会員メニューからサーバ証明書ファイル server.crt をダウンロードできます。そこで、
/etc/httpd/conf
sudo mkdir ssl.crt
と新しいディレクトリを作成してそこに server.crt を置きます。さらにJPRSのサイト


から中間CA証明書 internal.cer をダウンロードして同じディレクトリに置くとSSL証明書の発行手続きは終了です。もちろん、これらの証明書のファイル名は自由に書き換えられます。あとは httpd.conf を編集してアパッチを再起動すればOKです。ただし、複数のサブドメインでサイトを運用している場合はこの編集作業が単純ではありません。また古いSSL関連ファイルがあるようでしたら削除しておく必要があります。今回作成したファイル vhost_aaa.conf は次のようなものです。

# setting for ssl
LoadModule ssl_module modules/mod_ssl.so
Listen 443
NameVirtualHost *:443

SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

# setting for aaa.example.co.jp domain
<VirtualHost *:443>
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCertificateKeyFile   /etc/httpd/conf/ssl.key/server.key
  SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.cer
  SSLCertificateFile      /etc/httpd/conf/ssl.crt/server.crt

  DocumentRoot "/var/www/html/aaa/app/webroot"
  ServerName aaa.example.co.jp:443
  ErrorLog /var/log/httpd/aaa-error_log
  CustomLog /var/log/httpd/aaa-access_log combined env=!no_log
  AddDefaultCharset UTF-8
  SetEnv CAKE_ENV production
  DirectoryIndex index.php
  <Directory "/var/www/html/aaa/app/webroot/">
    AllowOverride All
    Options Indexes FollowSymLinks
  </Directory>
</VirtualHost>

ルートディレクトリが /var/www/html/aaa/app/webroot/ となっているのはCakePHPのフレームワークを使っているためです。エラーログやアクセスログのディレクトリは適当なものにしてください。重要な点は、SSL証明書、中間CA証明書のパスを含めたファイル名を間違えないことです。

Apache再起動の度にssl.key関連の確認が来るためパスフレーズ応答を削除します。
cd /etc/httpd/conf/ssl.key/
sudo openssl rsa -in server.key -out server.key

sudo service httpd restart
としてアパッチを再起動すると https://aaa.example.co.jp が表示されるはずです!

最後に、http://aaa.example.co.jp 以下のページを自動で https にするためにサブドメインの confファイルを次のように編集します。

<VirtualHost *:80>
ServerName aaa.exampe.co.jp
ErrorLog /var/log/httpd/aaa-error_log
CustomLog /var/log/httpd/aaa-access_log combined env=!no_log
SetEnv CAKE_ENV production
AddDefaultCharset utf-8
DirectoryIndex index.php
# Routing                                                                                                     
RewriteEngine On
RewriteRule ^/(img|css|js|files)/(.*)\$ /var/www/html/aaa/app/webroot/\$1/\$2 [L]
# RewriteCond %{HTTP_HOST} !^aaa.example.co.jp\$ [NC]
# RewriteRule ^/(.*)\$ http://aaa.example.co.jp/\$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)\$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

DocumentRoot "/var/www/html/aaa/app/webroot"
</VirtualHost>

不要部分を# でコメントアウトして2行
RewriteCond %{HTTPS} off
RewriteRule ^(.*)\$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
追加するだけです。

再度、アパッチを再起動するとhttpからhttpsへ自動遷移することが確認できます。

もう一方のサブドメインについても同様です。ただし、server.key, server.crtの名前を変更する必要があります。以下ではそれぞれ server01.key, server01.crtとしました。中間CA証明書 internal.cer は使いまわしできます。復習もかねて必要なコマンドを列挙します。

cd /etc/httpd/conf/ssl.key
sudo openssl genrsa -des3 -out server01.key 2048
cd /etc/httpd/conf
sudo openssl req -new -key ssl.key/server01.key -out ssl.csr/server01.csr
cat ssl.csr/server01.csr
cd /etc/httpd/conf.d
sudo vim vhost_bbb.conf
cd /etc/httpd/conf/ssl.key/
sudo openssl rsa -in server01.key -out server01.key
sudo service httpd restart

ただし、vhost_bbb.confとしては以下のファイルを用います。

# setting for bbb.example.co.jp domain
#NameVirtualHost *:443

<VirtualHost *:443>
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCertificateKeyFile   /etc/httpd/conf/ssl.key/server01.key
  SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.cer
  SSLCertificateFile      /etc/httpd/conf/ssl.crt/server01.crt

  DocumentRoot "/var/www/html/bbb/app/webroot"
  ServerName bbb.example.co.jp:443
  ErrorLog /var/log/httpd/bbb-error_log
  CustomLog /var/log/httpd/bbb-access_log combined env=!no_log
  AddDefaultCharset UTF-8
  SetEnv CAKE_ENV production
  DirectoryIndex index.php
  <Directory "/var/www/html/bbb/app/webroot/">
    AllowOverride All
    Options Indexes FollowSymLinks
  </Directory>
</VirtualHost>

前回とは異なりSSL設定のスクリプトは必要ないことに注意してください。以前同様、該当するサブドメインのconfファイルに
RewriteCond %{HTTPS} off
RewriteRule ^(.*)\$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
を追加して、アパッチを再起動すればSSL化の作業は終了です。もちろん、aaa, bbb以外のサブドメインでは以前と同じ設定になっています。なお、どうでもいいことですが、今回のブログではドルマークがいくつか出てきましたが、MathJax使っているためドルマークの前に円マークをつけて表示させています。

0 件のコメント: