LightsailでLet’s Encryptを使う

11月 5, 2020AWS,HTTPS化,Lightsail

作業に必要なスキル

Linuxコマンド操作、vimの操作、WordPress操作

Let’s Encryptとは

Let’s Encryptとは、フリーなSSL/TLS証明書です。通常、SSL/TLS証明書は料金を払ってWebサイトに設定するものです。しかし、Let’s Encryptを利用すれば、無料でSSL/TLS証明書を自サイトに設定できます。GoogleやCisco、GithubなどのIT企業がLet’s Encryptのスポンサーになっているので、セキュリティ的にも機能的にも満足できるサービスとして多くのサービスで利用されています。

LightsailでSSL/TLS証明書を設定する2つの方法

LightsailでSSL/TLS証明書を設定する方法を2つ紹介します。1つ目は、Lightsailでロードバランサを設定することで、追加でAWSのSSL/TLS証明書を設定する方法があります。この方法の場合、ロードバランサ料金として毎月$18ドル必要になります。メリットとして、企業等のWebサイトである程度アクセスが集中する場合、しっかりとロードバランサで負荷分散する必要があるなら、こちらをおすすめします。
もう一つの方法が、今回紹介するLet’s Encryptを利用する方法です。無料で利用できるので、個人や小規模のサイトなどの場合におすすめします。

LightsailでのLet’s Encryptの設定方法

Lightsailの管理画面からオレンジのアイコン押して、コンソールにログインして下さい。WordPress以外のインスタンスの場合もやり方は同様です。

真っ黒なコンソール画面が表示されますので、以下の一連のコマンドを入力して下さい。

参考元:ブログサイトの HTTPS 化
参考本:Let’s EncryptでSSL認証が「insecure permissions」と表示されうまくいかない
(Let’s Encriptは/usr/local/binに設置しないと、自動更新がうまく動作しません。)

// cdで移動します(Let's Encriptは/usr/local/binに設置しないと、自動更新がうまく動作しません。)
$ cd /usr/local/bin
// gitでリポジトリをcloneします
$ git clone https://github.com/letsencrypt/letsencrypt
// change directoryでディレクトリを移動します
$ cd letsencrypt
$ ./letsencrypt-auto
$ ./letsencrypt-auto certonly --webroot -w /opt/bitnami/apps/wordpress/htdocs/ -d ドメイン名

// 以下の表示がされて、処理が一時停止されますので、メールアドレスを入力して下さい。
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): メールアドレスを入力してエンターキーを押します。
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A ← A を入力してエンターキーを押します。
 
 
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Lets Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N ← メーリングリストに登録する場合は Y、しない場合は N を押してエンターキーを押します。
 
// コピーします 
$ sudo cp /etc/letsencrypt/live/ドメイン名/fullchain.pem /opt/bitnami/apache2/conf/server.crt
$ sudo cp /etc/letsencrypt/live/ドメイン名/privkey.pem /opt/bitnami/apache2/conf/server.key
// Webサーバーをリスタートする
$ sudo /opt/bitnami/ctlscript.sh restart apache
// viかvimでwp-config.phpを編集します。
$ vim /opt/bitnami/apps/wordpress/htdocs/wp-config.php
 
### 以下のように変更します。https を忘れずに入力します。###
if ( defined( 'WP_CLI' ) ) {
$_SERVER['HTTP_HOST'] = 'localhost';
}
 
define('WP_SITEURL', 'https://ドメイン名');
define('WP_HOME', 'https://ドメイン名');

viかvimでファイルを編集するので、「i」ボタンで編集モードに入って、編集後、「ESC」ボタンで編集モードを出て、「:wq」を入力してファイルを保存終了します。
操作の方法がわからない場合、vimで検索しましょう。

ここまで完了したら、https://独自ドメイン でChromeから表示を確認しましょう。
URLの左側に鍵マークが付いていることを確認して下さい。

WordPressのダッシュボードから「設定」→「一般」を選択します。WordPressのアドレスがhttpsに変更していることを確認して下さい。

問題点として、サイトのいくつかのページはHTTPS化してても、いくつかのページがHTTPのままになっているところです。

サイト全体をHTTPS化する

Really Simple SSLを使わない方法

Really Simpple SSLを使わないでも、サイト全体はHTTPS化されます。うまく行かない場合は、Really Simple SSLを使えばいいと思います。

Really Simple SSLを使う方法

サイト全体をhttps化をするのは、WordPressのプラグインで行うのが簡単です。今回は「Really Simple SSL」を使ってサイト全体をhttps化します。
・ダッシュボード → プラグイン → 新規追加 → 「Really Simple SSL」を今すぐインストールする。

「有効化」ボタンを押下します。
すると、以下のようなエラーが出ると思います。

システム検出の際に問題が発生しました。siteurl または homeurl が wp-config.php で定義されていることが検出されましたが、ファイルが書き込み可能ではありません。
wp-config.php を書き込み可能にし、このページを再読み込みしてください。

Really Simple SSLの有効化のエラーを解決する


Lightsailの管理画面からインスタンスのコンソールにログインします。
オレンジ色のアイコンを押します。

// 移動します
cd apps/wordpress/htdocs/
// パーミッションを変更します
chmod 660 wp-config.php
// 確認します
ls -al ./wp-config.php
-rw-rw---- 1 bitnami daemon 4219 Apr 19 14:57 wp-config.php

この状態で、WordPressのダッシュボードから「Really Simple SSL」のプラグインを有効化します。
「はい、SSLを有効化します。」というボタンを押すことで有効化します。

// パーミッションを元に戻します
chmod 640 wp-config.php
-rw-r----- 1 bitnami daemon 4219 Apr 19 14:57 wp-config.php

サイト上のすべてのページがHTTPS化されていることを確認しましょう。

SSL証明書を自動更新する

Let’s Encryptの証明書の期限は3ヶ月なので、更新の際は自動更新するのが便利です。
LinuxOSでは、定期実行させるときにはcronを利用します。
SSL証明書を発行する際に、certbotを利用するのでLightsailにcertbotをインストールしていない場合は、インストールする必要があります。certbotとは無料でSSL証明書を発行できるツールであり、Let’s Encryptで利用します。

Lightsailにcertbotをインストールする

Lightsailのコンソールで以下のコマンドを実行すればcertbotはインストールできます。

// certbotをインストールします
sudo apt-get install certbot -y

ちなみに、2020年4月、自分の場合これだけでLightsailにcertbotをインストールできてしまったのですが、Lightsailの公式ではadd-apt-repositoryを利用しましょうということでした。⇒ Lightsailチュートリアル

add-apt-repositoryとは

add-apt-repositoryは、apt-getのリポジトリ情報を追加する仕事をします。リポジトリとは「保管場所」のことです。つまり、apt-get install xxxx すると、Ubuntuに色々なパッケージをインストールすることができますが、リポジトリの住所がわからなくてインストールできないような場合に、apt-add-repositoryを利用することでインストールできるようになります。

apt-add-repositoryは software-properties-commonに含まれています。このため、apt-add-repositoryを利用するためには、software-properties-commonをインストールする必要があります。

// とりあえずapt-getを更新します
sudo apt-get update
// software-properties-commonをインストールします
sudo apt-get install software-properties-common
// Certbot をローカル apt リポジトリに追加します
sudo apt-add-repository ppa:certbot/certbot -y
// 新しいリポジトリを更新します
sudo apt-get update -y
// certbotをインストールします
sudo apt-get install certbot -y
// certbot-autoがないことを確認します
ls /usr/local/certbot    (Enterではなく、tabを2回押す)

この記事の手順で実行すると、certbot-autoがないという状態になるはずです。
certbot-autoがないと証明書の作成の自動化ができないので、certbot-auto をインストールします。

certbot-autoのインストールと設定と確認

// certbot-autoをインストールする
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/local/bin/certbot-auto
// certbot-autoのパーミッションを755から700に変更する
$ sudo chmod 700 /usr/local/bin/certbot-auto
// パーミッションを確認する
$ ls -al /usr/local/bin/certbot-auto
// 証明書が更新されるかのテストをする
$ sudo /usr/local/bin/certbot-auto renew --post-hook "sudo service httpd restart"
// この記事の手順で実行していれば、すでに証明書が発行されているので以下のような記述となります
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/独自ドメイン.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/独自ドメイン/fullchain.pem expires on 2020-07-18 (skipped)
No renewals were attempted.
No hooks were run.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

これでcertbot-autoがインストールされたことが確認できました。
上の表示の場合は、「次の証明書はまだ更新の予定ではありません。2020年7月18日にSSL証明書が切れます。更新はされませんでした。フックは実行されませんでした。」ということで、6月18日以降に更新をすることが可能ということになります。後日、更新がされているかを確認しましょう。

cronでcertbotを定期的に自動実行させる

// cronの確認(crondではなく、cron)
$ service cron status
active (running) になっていることを確認する

// cronに設定する(-eは超危険、といいつつも-eでやります)
// エディタの選択が出たら、3番のvim.basicがおすすめ
$ crontab -e
(最終行に以下のcron設定を記述して下さい)
(iを押して挿入モードにして、編集後escを押して、:wqを押して保存終了する)
0 17 * * * root /usr/local/bin/certbot-auto renew --post-hook "service httpd restart" > /var/log/cron_job.log 2>&1

これで毎17時にSSL証明書を作成する予定が作成されます。
ただし、作成できるのは、有効期限の1ヶ月前にならないとできません。

crontab の内容の説明

・> /var/log/cron_job.log 2>&1 とリダイレクトすることで、cronの実行結果を指定したファイル(/var/log/cron_job.log)に保存することができます。
2>&1 は、標準エラー出力が標準出力と一緒にファイルへリダイレクトする設定です。

証明書が更新されているかを確認する

後日、SSL証明書が自動で更新されているか、cronが実行されているかを確認します。
以上で、LightsailでWordPressのSSL証明書をLet’s Encryptで設定する解説を終わります。

手動で証明書を更新する

SSL証明書は発行してから3ヶ月後までしか有効期限がもちません。SSL証明書が更新されないで失効した場合、ブラウザの表示は以下のようになります。

SSL証明書が自動で更新されない場合は、let’s Encriptの自動更新がうまく行っていません。原因を調べて修正することになりますが、修正出来るまでの間は、手動でSSL証明書を更新するしかありません。Lightsailのコンソールにログインするかssh接続して、以下のコマンドを入力します。

cd /usr/local/bin/letsencript
// 証明書が更新されるかのテストをする
sudo /usr/local/bin/certbot-auto renew --post-hook "sudo service httpd restart"

「LightsailのWordPressでサイト構築」の全体の作業フロー

「LightsailのWordPressでサイト構築」の全体の作業フローです。順番に進めて下さい。
Lightsailの導入
・AWSに登録する
LightsailでWordPressのインスタンスを作成する
Lightsailに固定IP & 独自ドメインを設定する
Lightsailインスタンスの初期ログインのパスワードの取得
・(ロードバランサの作成 & SSL/TLS証明書の設定)
Let’s EncryptによるSSL/TLS証明書の設定
WordPressの導入
WordPressの右下に表示されるbitnamiのロゴを非表示にする
・メールの設定をする(GmailのAPIを利用)
・ユーザーを追加する(初期ユーザを消す)
Luxeritasの導入
WordPressにLuxeritasを導入してテーマとして使う
Luxeritasで「目次」を表示する
・記事の作成