Amazon LightsailでWordPressブログを作ってみる(4)~Let’s EncryptでSSL設定する~

2018-04-13AWS


この回ではLet’s EncryptのSSL証明書を設定して、自分のサイトをHTTPS化します。自分やユーザーの通信が見られるのを防ぐ安全のためと、Google検索もHTTPSのサイトを優先するのでSEOのためにも必要になります。

Let’s Encryptはフリーでオープンな認証局です。無料でサーバー証明書を作ることが出来ます。

certbotはLet’s Encryptのクライアントソフトです。サーバーにインストールされ、サーバーの設定や証明書の取得や更新などを自動で行います。以下が参考リンクです。

参考

Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル

Let’s Encrypt で Nginx にSSLを設定する – Qiita

Lightsail(ubunts + bitnami)上では多少設定を変更する部分があります。以下を参考にやってみます。

参考:

あなたのAmazon LightSailでSSL証明書を設定するステップバイステップガイド[Wordpress]

Using Let’s Encrypt certificates with WordPress on Amazon Lightsail | advance512 – A Programmer’s Blog

certbotインストール

certbotをインストールする方法は色々あります。Certbot クライアントのインストール – Let’s Encrypt 総合ポータル

今回はcertbotをgit cloneを使ってダウンロードすることにします。展開する先はどこでもいいので、ルートのtmpに移動してgit cloneしました。

$ cd /tmp
$ git clone https://github.com/certbot/certbot

cloneしたフォルダに移動して、certbot-autoコマンドが実行できるか確認します。

$ cd certbot
$ ./certbot-auto --help

helpが表示されると成功です。

.well-knownフォルダを作る

認証局がドメインを確認するのに.well-knownフォルダを訪れるので、先にそのフォルダを作って設定しておきます。

mkdir /home/bitnami/apps/wordpress/htdocs/.well-known

.well-knownフォルダにアクセスできるように.htaccessファイルを作ります。

sudo nano /home/bitnami/apps/wordpress/htdocs/.well-known/.htaccess

.htaccessファイルに以下を書いて保存します。

#
# Override overly protective .htaccess in webroot
#
RewriteEngine On
Satisfy Any

certbot-autoコマンドで証明書を作る。

さっそく認証局の証明書を作成していきます。

作成するにはcertbot-autoコマンドを使います。

wwwが付いたものと付いてないドメインの2つのドメイン用の証明書を作ります。

./certbot-auto certonly --webroot -w /home/bitnami/apps/wordpress/htdocs/ -d ドメイン名 -d www.ドメイン名

コマンドを実行すると、メールアドレスや利用規約への同意を聞かれると思います。(コマンドの意味や聞かれること参考Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル

答えていくと証明書とキーが作成されたと表示されます。

bitnamiの参照先設定を変更してリスタートする。

作成した証明書とキーをbitnamiが参照できるようにします。

証明書関連の参照先パスはデフォルトだと、"/opt/bitnami/apache2/conf/server.crt"とかになっているので、こいつをcertbotが生成する場所に変更します。

まずbitnami.confファイルをエディタで開きます。

sudo nano /opt/bitnami/apache2/conf/bitnami/bitnami.conf

以下の設定箇所を探します。

SSLCertificateFile "/opt/bitnami/apache2/conf/server.crt"
SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server.key"

上記をコメントアウトして、certbot-autoで作った証明書先に設定します。

以下のようにしました。{Domain}となっている箇所はcertbot-autoで作った(wwwの付いてない方の)ドメイン名に変更してください。

#SSLCertificateFile "/opt/bitnami/apache2/conf/server.crt"
#SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server.key"
SSLCertificateFile "/etc/letsencrypt/live/{Domain}/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/{Domain}/privkey.pem"
SSLCACertificateFile "/etc/letsencrypt/live/{Domain}/fullchain.pem"

最後に変更が反映されるようにapacheをリスタートします。

sudo /opt/bitnami/ctlscript.sh restart apache

一度サイトにhttpsでアクセスしてみる。

さあこれでサイトにhttpsでアクセス出来るようになったと思います。アドレスの横に鍵マークが付いていると思います。
「!」マークがついている場合はサイト内にhttpのリンクがないか確認してみてください。

cronで自動で更新するようにする。

Lets Encryptの証明書の期限は90日です。定期的に更新する必要があります。

certbotではcertbot-auto renewというコマンドで証明書の更新が行えます。また、このコマンドは証明書の期限が一か月を切っていない場合は何もせず終了します。

なのでcronで定期的にこのコマンドを実行するようにします。頻度は一日に2回が良いとされているようです。

(ここはまだ自信がないのですが)以下のようにしました。

まずcronファイルを編集するためにファイルを呼び出すコマンドを実行します。

crontab -e

(初回時は使うエディタを選ぶ必要があります。)
開いたファイルの最後に以下の行を書きます。

0 */12 * * * /tmp/certbot/certbot-auto renew --quiet --no-self-upgrade --post-hook "/opt/bitnami/ctlscript.sh restart apache"

(/temp/certbot/certbot-autoの部分はcertbotをインストールしたパスを指定してください。)

コマンドの意味は、

0 */12 * * * 12時間ごと
--quiet は出力に何も出さないという設定。
--no-self-upgrade はこのときにcertbotの更新を行わないという設定(よくわからない)
--post-hook は更新された後に実行するコマンドを指定します。ここでapacheのリスタートを行います。

書いたらファイルを保存します。(nanoを選んだ場合だとCtrl+Oで名前をチェックしてenter)

–quietを–dry-runにするとコマンドを試すこともできます。

/tmp/certbot/certbot-auto renew --dry-run --no-self-upgrade --post-hook "/opt/bitnami/ctlscript.sh restart apache"

とりあえずこれで行けそうですかね。。でもなんかシンタックスエラーがでる。。。

コマンド解説 – Let’s Encrypt 総合ポータル

Let’s encrypt運用のベストプラクティス – Qiita

apacheの設定で、http接続をhttpsにリダイレクトする。

サーバーにhttpのアクセスがあった場合にhttpsアドレスへリダイレクトするようにすると、HTTPSのみになってユーザーも安全です。

/opt/bitnami/apps/wordpress/conf/httpd-prefix.confファイルの先頭に次の行を追加します。

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]

再度apacheをrestartします。

sudo /opt/bitnami/ctlscript.sh restart apache

これで、httpのアドレスにアクセスがあった場合、httpsにリダイレクトするようになりました。

WordPressの設定を変更

最後に、Wordpressの「サイトURL」と「ホームURL」の設定を変更します。

この設定をしておかないと、投稿時にメディアなどを挿入すると、リンク先アドレスがhttpになります。するとブログはhttpsとhttpのリンクが混ざったページになってしまい、混合Contentとしてブラウザのアドレス欄に鍵マークではなく、注意マークが出てしまいます。

nanoなどでwp-configファイルを開きます。

sudo nano /opt/bitnami/apps/wordpress/htdocs/wp-config.php

以下の設定が書かれているところを探します。

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');

ここのhttpをhttpsに変更します。

define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');

保存して完了です。

終わりに

これでHTTPS化の設定は終わりです。なかなか勉強になりました。

今回はLets Encryptという、より便利で安全な仕組みが出来ているのを知れたのが収穫でした。

次はwordpressからメールが届くように設定します。

追記:今回の方法とは違う方法もあるようですGenerate and Install a Let’s Encrypt SSL Certificate for a Bitnami Application