Homebrew上で構築したWebサイトのSSL化 (Let’s Encrypt)

結構苦労をしたので、メモがわりにやり方をここに載せておく (23/4/2018一部更新)。Apacheは、たんにbrew install httpdでインストールしたもの (Apache/2.4.33)。

Let’s Encryptを使うため、certbotをインストールする。

brew install certbot
sudo certbot certonly --webroot -d hoge.hoge.ac.jp -w /usr/local/var/www

メイルアドレス等を訊かれるので、指示に従ってインスト-ル作業を進める (hoge.hoge.ac.jpや/usr/local/var/wwwは環境に応じて書く)。
/usr/local/etc/httpd/httpd.confのApache設定ファイルを以下のように書き換える。

#ServerName localhost:80
LoadModule ssl_module libexec/apache2/mod_ssl.so
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
Include /private/etc/apache2/extra/httpd-ssl.conf
<VirtualHost *:80>
 ServerAdmin root@hoge.hoge.ac.jp
 DocumentRoot /usr/local/var/www
 ServerName hoge.hoge.ac.jp
</VirtualHost>

LoadModuleやIncludeのところは#をはずすだけ。次に、/usr/local/etc/httpd/extra/httpd-ssl.confを以下のように書き換える。ポート番号が8443になっているものは全て443に訂正する。

DocumentRoot "/usr/local/var/www"
ServerName hoge.hoge.ac.jp:443
ServerAdmin root@hoge.hoge.ac.jp
#SSLCertificateFile "/usr/local/etc/httpd/server.crt"
SSLCertificateFile "/etc/letsencrypt/live/hoge.hoge.ac.jp/cert.pem"
#SSLCertificateKeyFile "/usr/local/etc/httpd/server.key"
SSLCertificateKeyFile "/etc/letsencrypt/live/hoge.hoge.ac.jp/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/hoge.hoge.ac.jp/chain.pem"

ここまで書いたらsudo brew services restart httpdでApacheを再起動する。

sudo certbot renew --dry-run

Let’s Encryptは3ヶ月ごとに更新 (renew) しなければならない。更新できるかどうか、テスト (–dry-run) しておく。

sudo crontab -e
5 6 * * 0 sudo /usr/local/bin/certbot renew >> /var/log/certbot.log 2>&1
5 6 * * 0 sudo brew services restart httpd

cronにrenewを定期的に実行するように書いておく (訂正。httpdを再起動する必要がある 2024年4月21日追記)。この例では毎週日曜日の6時5分に実行する。
ちゃんと動作しているかどうか確認しておく。以下の例ではまだ更新するタイミングではないので、renewalは行われていない。

cat /var/log/certbot.log
Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/hoge.hoge.ac.jp.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
-------------------------------------------------------------------------------
The following certs are not due for renewal yet:
 /etc/letsencrypt/live/hoge.hoge.ac.jp/fullchain.pem expires on 2018-07-17 (skipped)
No renewals were attempted.
-------------------------------------------------------------------------------

httpでアクセスされたら自動的にhttpsにリダイレクトされるように、.htaccessファイルに以下の記述を追加。/usr/local/var/www直下のものと、/usr/local/var/www/wp (WordPressインストールディレクトリ) 以下のファイル両方に書いておく。なお、WordPressインストールディレクトリ以下の.htaccessファイルにはいろいろ既に書かれてあるので、一番上に挿入しておく。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

以上が終わったら、WordPressの設定→一般で、httpになっているものをhttpsに変更する。なお、マルチサイト機能を利用している場合は、データべース上でwp_optionsテーブルのsiteurlを書き換える。MacならSequel Proなどを使えば簡単。