1. はじめに
SSL証明書は無料の「Let's Encrypt」を使用し、その操作にはGo言語製のACMIクライアント「Lego」を使用する(あのLEGOじゃないよ)。
- Let's Encrypt: https://letsencrypt.jp/
- Lego: https://github.com/xenolf/lego
適用するドメインは「Bitnami」上で動く「WordPress」製のWebサイトで使用しているもの。
今から書いていく実装方法の説明の中で使用する「APP_DOMAIN」「MAIL@EXAMPLE.COM」は適宜変更。見出しに出てくる「[WP]」は WordPress 上で行う作業を指しています。
2. Legoのインストール
CLI
$ cd /tmp
$ curl -s https://api.github.com/repos/xenolf/lego/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -
$ tar xf lego_vX.Y.Z_linux_amd64.tar.gz
$ sudo mv lego /usr/local/bin/lego
3. Legoを使ってSSL証明書を発行する
CLI
$ sudo /opt/bitnami/ctlscript.sh stop
$ sudo lego --email="MAIL@EXAMPLE.COM" --domains="APP_DOMAIN" --path="/etc/lego" run
Your account credentials have been saved in your Let's Encrypt
configuration directory at "/etc/lego/accounts/acme-v02.api.letsencrypt.org/MAIL@EXAMPLE.COM".
You should make a secure backup of this folder now. This
configuration directory will also contain certificates and
private keys obtained from Let's Encrypt so making regular
backups of this folder is ideal.
2018/12/09 08:10:30 [INFO] [APP_DOMAIN] acme: Obtaining bundled SAN certificate
2018/12/09 08:10:31 [INFO] [APP_DOMAIN] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz/******************************
2018/12/09 08:10:31 [INFO] [APP_DOMAIN] acme: Authorization already valid; skipping challenge
2018/12/09 08:10:31 [INFO] [APP_DOMAIN] acme: Validations succeeded; requesting certificates
2018/12/09 08:10:32 [INFO] [APP_DOMAIN] Server responded with a certificate.
4. 作成されたSSL証明書をシステムから参照できるようにする
CLI
$ sudo mv /opt/bitnami/apache2/conf/server.crt /opt/bitnami/apache2/conf/server.crt.old
$ sudo mv /opt/bitnami/apache2/conf/server.key /opt/bitnami/apache2/conf/server.key.old
$ sudo mv /opt/bitnami/apache2/conf/server.csr /opt/bitnami/apache2/conf/server.csr.old
$ sudo ln -s /etc/lego/certificates/APP_DOMAIN.key /opt/bitnami/apache2/conf/server.key
$ sudo ln -s /etc/lego/certificates/APP_DOMAIN.crt /opt/bitnami/apache2/conf/server.crt
$ sudo chown root:root /opt/bitnami/apache2/conf/server*
$ sudo chmod 600 /opt/bitnami/apache2/conf/server*
$ sudo /opt/bitnami/ctlscript.sh start
5. SSL証明書を自動更新させる
SSL証明書更新用のスクリプト「/etc/lego/renew-certificate.sh」を作成し、cronで定期実行させる。
CLI
$ sudo vi /etc/lego/renew-certificate.sh
=================================
#!/bin/bash
$ sudo /opt/bitnami/ctlscript.sh stop apache
$ sudo /usr/local/bin/lego --email="EMAIL@EXAMPLE.COM" --domains="APP_DOMAIN" --path="/etc/lego" renew
$ sudo /opt/bitnami/ctlscript.sh start apache
=================================
$ sudo chmod +x /etc/lego/renew-certificate.sh
$ sudo crontab -e
=================================
0 0 1 * * /etc/lego/renew-certificate.sh 2> /dev/null
=================================
$ sudo crontab -l
0 0 1 * * /etc/lego/renew-certificate.sh 2> /dev/null
6. [WP] .htaccessとwp-config.phpの設定
WordPressの設定ファイル「.htaccess」「wp-config.php」をHTTPSプロトコルに適用させる。
CLI
$ sudo vi /opt/bitnami/apps/wordpress/htdocs/.htaccess
=================================
# 以下のコードを追加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
:
=================================
CLI
$ vi /opt/bitnami/apps/wordpress/htdocs/wp-config.php
=================================
// プロトコルを "https://" に変更
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');
// 以下のコードを追加
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
=================================
Apacheを再起動させる。
CLI
$ sudo /opt/bitnami/ctlscript.sh restart apache
7. [WP] 記事コンテンツ内のテキストを変換
記事コンテンツ内の「http://」というテキストを「https://」に変換する。テキストの変換はプラグイン「Search Regex」を使用する。
使い方は以下の記事を参考に。
反省点・注意点とか
- 上手くHTTPSに切り替わらない場合は「6. [WP] .htaccessとwp-config.phpの設定」部分のコードがおかしい場合はある
- EC2のセキュリティグループで「443」ポート(HTTPS)を開ける(開けない場合、サイトにアクセスするとリダイレクトループが起こる)
- ブラウザのキャッシュは切ろう
参考記事
- https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/
- https://docs.bitnami.com/aws/how-to/configure-elb-ssl-aws/#step-4-modify-the-web-server-configuration-on-the-bitnami-application-instance
- https://osusume-houhou.com/search-regex-how-to-globally-replace-the-image-url-to-https-from-http/