【Let's Encrypt】WordpressへのアクセスをSSL化（HTTPS）on AWS Lightsail

# 1.はじめに
以前Lightsailを使用してWordpress環境を構築したのですが、サイトへのアクセスをHTTPS化する方法に凄い悩まされました。
やり方は色々とあるのですが、（CloudFrontやLBを終端にしてACMで証明書を発行する等）別にSSL化したいだけだしなと思いLetsencriptを使用して単純に通信をSSL化する方法を選びました。
ドキュメントや記事はあるにはあるのですが、まあ上手くいかずとても苦労しました。
今回はそんなWordPress環境の通信をSSL化するハンズオンを実施していこうと思います。

# 2.概要
## 2.1 作業工程</b>
- Let's Encryptをダウンロード
- 証明書を発行
- リダイレクト設定
- cronにshを登録し、証明書を自動発行

## 2.2 目標
目標A：WordPressで作成したWebサイトへのアクセスをSSL/TLS化（https）
目標B：証明書の発行を自動化する（スクリプトを作成しcrontabへ登録）

# 3.事前準備
- Lightsailを使用してWordPressを構築する。
- 静的IPを使用してドメインを設定、ドメインとURLでサイトへアクセス出来る環境を作成。

# 4.Letsencriptをダウンロード
### 概要
- Letsencriptをダウンロードして証明書を発行。
- 証明書ファイルの権限を適切なものに設定する。
　
### 手順
LightsailインスタンスにSSH接続します。
コンソール上で以下コマンド手順を実行して下さい。

```bash
# /tmp配下に「lego」をダウンロード
bitnami@ip-*-*-*-*:~$ cd /tmp
bitnami@ip-*-*-*-*:~$ curl -Ls https://api.github.com/repos/xenolf/lego/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -

# インストールした「lego」を解凍して専用のディレクトリへ導入
bitnami@ip-*-*-*-*:~$ tar xf lego_v*
bitnami@ip-*-*-*-*:~$ sudo mv lego /usr/local/bin/lego

# bitnamiを停止
bitnami@ip-*-*-*-*:~$ sudo /opt/bitnami/ctlscript.sh stop

# 「lego」を実行 ※以下の部分を環境に合わせて変更して下さい。
# 貴方のメールアドレス⇒【hoge@example.com】/ サイトのドメイン名⇒【example.com】
bitnami@ip-*-*-*-*:~$ sudo lego --email="hoge@example.com" --domains="example.com" --path="/etc/lego" --http run
# ※途中Do you accept the TOS? Y/nと聞かれるので[y]と入力してEnter
Do you accept the TOS? Y/n
y

# 証明書ファイルをバックアップ
bitnami@ip-*-*-*-*:~$ sudo mv /opt/bitnami/apache2/conf/server.crt /opt/bitnami/apache2/conf/server.crt.old
bitnami@ip-*-*-*-*:~$ sudo mv /opt/bitnami/apache2/conf/server.key /opt/bitnami/apache2/conf/server.key.old
bitnami@ip-*-*-*-*:~$ sudo mv /opt/bitnami/apache2/conf/server.csr /opt/bitnami/apache2/conf/server.csr.old

# シンボリックリンクの作成 
#【***.**】は作成したドメイン名に置き換えて下さい。サブドメインは付けないで下さい。例：example.com)
bitnami@ip-*-*-*-*:~$ sudo ln -s /etc/lego/certificates/***.**.key /opt/bitnami/apache2/conf/server.key
bitnami@ip-*-*-*-*:~$ sudo ln -s /etc/lego/certificates/***.**.crt /opt/bitnami/apache2/conf/server.crt

# 証明書ファイルのパーミッションを変更
bitnami@ip-*-*-*-*:~$ sudo chown -h root:root /opt/bitnami/apache2/conf/server*
bitnami@ip-*-*-*-*:~$ sudo chmod 600 /opt/bitnami/apache2/conf/server*

# bitnamiを再起動
bitnami@ip-*-*-*-*:~$ sudo /opt/bitnami/ctlscript.sh start

```
証明書の発行が完了してSSL/TLS通信が行われるようになりました。
ドメイン名でURLにアクセスしてみて下さい、SSL/TLS化されていることが確認できると思います。
続いて様々なアクセス時にSSL化されるようにしていきたいと思います。

# 4.http⇒httpsへのリダイレクト設定
### 概要
httpでアクセスされた際に自動でhttpsにリダイレクトするようconfigを設定。
　
### 手順
bitnamiのconfigを以下の通り編集します。

```bash
# bitnamiのconfigをviで開く
bitnami@ip-*-*-*-*:~$ sudo vi /opt/bitnami/apache2/conf/bitnami/bitnami.conf

-- bitnami.config --
～～略～～
<VirtualHost _default_:80>
  DocumentRoot "/opt/bitnami/apache2/htdocs"　
# 上２行の下に下記コードを追記
#【***.**】は作成したドメイン名に置き換えて下さい。サブドメインを付けて下さい。例：www.example.com)
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/(.*) https://***.***.**/$1 [R,L]
～～略～～

# Apacheを再起動
bitnami@ip-*-*-*-*:~$ sudo /opt/bitnami/ctlscript.sh restart apache

```
リダイレクト設定が完了しました。
httpでURLにアクセスしてみて下さい、自動でhttpsにリダイレクトされることが確認出来るはずです。
以上でSSL化に関しての作業は終了となりますが、証明書には有効期限がありますので、次項で指定のルーティンで証明書が自動発行されるように設定していきたいと思います。

# 5.SSL証明書を自動で定期更新する設定にする
### 概要
ここで注意事項なのですが、「Let's Encrypt」の証明書有効期限は3ヶ月となっています。
毎月手動で更新するのは面倒なので、自動で証明書を更新してくれるように設定したいと思います。
　
### 手順
新規shを作成して、そのスクリプトが月1で自動実行されるようにcronを設定する。

```bash
# 証明書発行スクリプトを作成します。
bitnami@ip-*-*-*-*:~$ sudo vi /etc/lego/cron_release_certificate.sh
# 下記コードを追加して下さい。
#!/bin/bash
sudo /opt/bitnami/ctlscript.sh stop apache
sudo /usr/local/bin/lego --email="***@***.**" --domains="***.**" --path="/etc/lego" --http renew

# 実行権限を付与
bitnami@ip-*-*-*-*:~$ sudo chmod +x /etc/lego/cron_release_certificate.sh

# cron設定
bitnami@ip-*-*-*-*:~$ sudo crontab -e

# 下記コードをcrontabに追記して下さい
# （上記スクリプトが毎月1日の0:00に自動実行されるように設定）
# （出力 & エラー内容を同一ファイルに出力するよう設定）
0 0 1 * * /etc/lego/cron_release_certificate.sh > /var/log/cron_release_certificate.log 2>&amp;1

```

暗号証明書が月1で自動発行されるようになりました。
不安であれば、スクリプトを手動実行し、ログファイルを確認することで、スクリプトが正常実行されるか確認する事ができます。

# 6.まとめ
以上の手順で、WebサイトへのアクセスがSSL/TLS化されるようになりました。

今時、Webサービスをリリースする際に通信やリソースに対して暗号化を行うのはマストです。
どんな暗号化ツールでも構いません。必ずWebサービスは暗号化するようにしましょう。

本ハンズオンはLinux操作のみで証明書の発行が行われるため、サードパーティ製ツールを絡まらせるやり方(AWS ACM等..)に比べると、非常に簡易的にリソースに対しての暗号化が行えます。

もしハンズオンをする中でハマりポイント等がありましたら是非コメント等頂けたらと思います。
以上で終了となります、ありがとうございました。