Bitnamiに乗っているWordPressのドメインSSL化手順

# 1. はじめに

SSL証明書は無料の「**Let's Encrypt**」を使用し、その操作にはGo言語製のACMIクライアント「**Lego**」を使用する（あのLEGOじゃないよ）。

* Let's Encrypt: https://letsencrypt.jp/
* Lego: https://github.com/xenolf/lego

適用するドメインは「**Bitnami**」上で動く「**WordPress**」製のWebサイトで使用しているもの。

* https://aws.amazon.com/jp/getting-started/tutorials/launch-a-wordpress-website/

今から書いていく実装方法の説明の中で使用する「**APP_DOMAIN**」「**MAIL＠EXAMPLE.COM**」は適宜変更。見出しに出てくる「**[WP]**」は WordPress 上で行う作業を指しています。

# 2. Legoのインストール

```shell: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証明書を発行する

```shell: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証明書をシステムから参照できるようにする

```shell: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で定期実行させる。

```shell: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プロトコルに適用させる。

```shell: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>
:
=================================
```

```shell: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を再起動させる。

```shell:CLI
$ sudo /opt/bitnami/ctlscript.sh restart apache
```

# 7. [WP] 記事コンテンツ内のテキストを変換

記事コンテンツ内の「**http://**」というテキストを「**https://**」に変換する。テキストの変換はプラグイン「**Search Regex**」を使用する。

* https://ja.wordpress.org/plugins/search-regex/

使い方は以下の記事を参考に。

* https://osusume-houhou.com/search-regex-how-to-globally-replace-the-image-url-to-https-from-http/

# 反省点・注意点とか

* 上手く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/