baserCMSサイトを『Let's Encrypt』でHTTPS化した話
『baserCMS Advent Calendar 2016』12月5日の当番 @teckingです! baserCMSのFacebookグループでAdvent Calendar参加の呼びかけを見て「書く書く詐欺状態」だった『Let's Encrypt』ネタがあるのを思い出しました。2017年初頭から『Google Chrome』で非HTTPSサイトにアクセスした際に「Not secure」表示がされる予定とのことで、ウェブサイトのHTTPS化がちょっとした話題になってますよね。
当サイトの動作環境はざっくり下記のとおりです。いろいろアップグレードしたい風味満載ですがバイナリパッケージに頼るとどうしても。
- OS……Ubuntu 14.04.5 LTS
- ウェブサーバ……Apache 2.4.10
- OpenSSL……1.0.1f
この環境に無料でSSL/TLS証明書を取得できるサービス『Let's Encrypt』を当ててみました。
導入方法は『Let's Encrypt 総合ポータル』というサイトの「Let's Encryptの使い方」ページに事細かに書かれているので、これを参考にしながらインストール作業を進めます。私がインストールした2016年3月ごろはたしか『Let's Encrypt クライアント』と称していましたが、今は『Certbot クライアント』と呼ぶようですね。
ともあれ、主要なディストリビューション別に手順が書かれているので、これに沿って進めていきましょう。
むしろ、その後の各種設定で見落とす箇所が少なくないかと思うので、個人的にハマったことをつらつら書いていきます。
証明書ファイル作成でエラーが出る
サーバをセットアップした際に「使わないから」という理由で、Ubuntu標準搭載のファイアウォール『UFW(Uncomplicated FireWall)』で443番ポートをふさいだのかもしれません。ということで443番ポートを開いてあげます。
sudo ufw allow 443 sudo ufw reload
もちろん、ウェブサーバ(Apache)にも443番ポートで接続できないといけないので /etc/apache2/ports.conf を開いて
<IfModule ssl_module> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule>
の記述があるかどうかも確認する必要があるかと。
baserCMSサイトでWebrootプラグインを適用するとき
Certbotクライアントには、稼働中のウェブサーバを止めずにSSL/TLS証明書を取得できる「Webrootプラグイン」というものがあります。プラグインを使うのであれば
certbot-auto certonly --webroot --webroot-path=/var/www/html -d www.example.com
というコマンドをたたけばよいのですが、baserCMSサイトに適用する場合はちょっと違うのでご注意を。というのも、baserCMSオフィシャルサイト「ドキュメントルートについて」ページにあるように、baserCMS(というかCakePHP)におけるドキュメントルートの扱いがやや特殊だからです。
なので、たとえば /var/www/html 配下にbaserCMSをインストールしているのであれば
--webroot-path=/var/www/html/app/webroot
とCakePHPの作法に沿ってドキュメントルートを記述することになります。
ただし、前述「ドキュメントルートについて」の「ドキュメントルートに通常どおり、htmlファイルなどを配置したい場合」に沿ってbaserCMSをインストールしているときは通常どおり
--webroot-path=/var/www/html
となります。
なぜか解消しない問題 - スマートURLなのに index.php が
ということで『Let's Encrypt』を使ってHTTPS化できた当サイト。それはめでたいことではあるのですが、トップページにアクセスした時になぜか末尾に index.php が付くようになりました。HTTPでアクセスしてきた際にHTTPSにリダイレクトしてくれるよう .htaccess に
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://%HTTP_HOST/$1 [R=301,L] </IfModule>
を追記したからなのかな?とも思ったのですが、同様の手順でHTTPS化した別のbaserCMSサイトには index.php 付かないのですよね。
違いがあるとすれば、当サイトは通常どおりのインストール、別のサイトは「ドキュメントルートに通常どおり、htmlファイルなどを配置したい場合」の手順に沿ったインストールということですね。このあたりが原因だったりするんでしょうか。うーむ。