AWS EC2 ubuntu+WordPressサイトをLet’s Encryptでhttps化するまで | そう備忘録

AWS EC2 ubuntu+WordPressサイトをLet’s Encryptでhttps化するまで

https化するにあたって

このブログは以下の環境で書いている。

 サーバー

AWS(Amazon Web Services) EC2(Elastic Compute Cloud)

OS

Ubuntu Server 16.04 LTS(HVM)64 bit

WEBサーバー

apache

CMS

WordPress Ver 4.9.6

そのうちにと思っていてうっかりhttps化を忘れていて、いくつか記事を書いた後で思い出したので遅ればせながらhttps化をする事にした。

https化をする理由は主に以下の2つ

  • セキュアなサイトにする(問い合わせフォームもあるので)
  • SEO対策の一環

備忘録的なブログなのと「問い合わせもそうそう無いだろう」と思っていたのでhttps化は後回しにしていたのだけれども、All in One SEO Packを入れてSEO対策を色々と試している一環で「https化したらPVとか変わるのかも」と思って試してみる事にした。

同じ様な環境の人の参考になれば幸いです。

方法を検討した

まず前提としては、

  • ローコストで実現したい
  • 認証レベルは Domain Validation (ドメイン認証)※でOK

※認証レベルはドメイン認証の他にはOrganization Validation(企業認証)、Extended Validation (EV認証)があるけど個人なのでドメイン認証で十分と判断した。

AWSを使う方法

最初に検討したのはサーバーがAmazon EC2なのでAWSのサービスを使う方法。

AWS Certificate Manager +ELB(Elastic Load Balancing)の構成を検討した。

AWS Certificate ManagerはSSL/TLSの証明書を管理するAWSのサービスの一つ。

SSL/TLSの証明書の発行会社は各種あって、金額はマチマチでもいずれも有料なのにも関わらずAWS Certificate Managerは無料なのが嬉しい。

ただしELB(Elastic Load Balancing)との組み合わせに限る、との事らしい。

ロードバランサー(負荷分散)なんか要らないんだけどね。そんなにアクセス無いし。

それにELBは初年度は無料(750時間/月)だけど2年目からは2,000円/月ほどかかってくる。

仕事、会社なら間違いなくこの構成なんだけど、もう少しお財布に優しい方法を検討してみる。

Let’s Encryptを使う方法

次に検討したのがLet’s Encrypt

  • SSL/TLSサーバ証明書を無料で発行
  • 証明書の発行・インストール・更新のプロセスが自動化されている
  • 証明書の有効期間は90日間
  • 非営利団体の ISRG (Internet Security Research Group) が運営(CiscoやAkamaiがスポンサー)

以前に会社で話が出たことがあったのだけれどもOrganization Validation(企業認証)を取れなかったので選択をしなかった。

だけど個人利用ならドメイン認証で十分だし、なにより財布に優しいのでこの方法でhttps化をすることにした。

手順

全体の手順をざっくり書くと、

  1. https用に443のポートを空ける
  2. Let’s Encrypt(certbot)をインストール&設定
  3. 記事中の画像(メディアファイル)へのアドレスをhttpからhttpsへ変更
  4. WordPressの設定変更
  5. Google Search Consoleの設定
  6. Google Analyticsの設定
  7. Let’s Encryptの自動更新の設定

を実施した。

443のポートを空ける

AWS EC2のセキュリティグループー>インバウンドルールの編集でhttps用の443ポートを空ける

443ポートを空ける

certbotのインストール

前提

最初は下記のコマンドでletsencryptのインストール&設定を試みたけど設定の所で「Client Does not support any combination of challenges that will satisfy the CA.」のエラーが出てしまった。

sudo apt-get install letsencrypt python-letsencrypt-apache -y

それならばと思い、Certbotチームが提供しているPPAリポジトリ※から最新版をインストールする方法に変更する事にした。

※PPA(Personal Package Archive)はubuntuの非公式の個人用リポジトリ。ubuntu公式では無いので一定のリスクがある分、公式には無い最新版をダウンロードすることもできる。
launchpadで必要なパッケージを検索する事ができる。

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-apache -y

今度は無事にインストールが完了した。

apacheへインストール

SSL/TLS サーバ証明書を取得して Apache にインストールする。

sudo certbot --apache

どれをhttps化するか聞いてくるので1を選択。

certbot apacheへのインストール

HTTPで接続してきた時にHTTPSにリダイレクトする(HTTP接続を無くす)かどうかの選択。

2.のHTTPSにリダイレクトするを選択する。

http接続を残さない

以下のメッセージが表示されてapacheへのインストール(設定)が成功した。

certbot apacheへのインストール成功

/etc/apache2/sites-availableにmain-le-ssl.confが新たに作成されていた。

またmain.confが編集されていてリダイレクトの設定が入っていた。

apacheの再起動

apacheを再起動してhttpsでの接続を確認した。

sudo service apache2 restart

https 保護された通信を確認

画像(メディアファイル)へのアドレスを変更

サイトはhttpsに対応したが記事中の画像(メディアファル)のアドレスがhttpのままなので画像を拡大表示している時のアドレス欄が保護された通信になっていない。

メディアファルが保護された通信になっていない

Really Simple SSLなどのプラグインのインストールも一瞬考えたのだけれども記事数も少ないのでテキストエディターで1記事づつ変換することにした。

プラグインししなかったのは過去の画像のURLの変換の為だけにインストールするプラグインを増やしたくなかったから。

記事を一つづつ呼び出してエディターに貼り付けてhttpからhttpsへ一括変換して、元の記事に貼り付けて保存を繰り返す。

30分位で終わったけど面倒な人はプラグインを使ったほうが楽かも。

WordPressの設定変更

WordPressのメニューから設定ー>一般

「Wordpress アドレス(URL)」と「サイトアドレス(URL)」をhttpからhttpsに変更して保存する。

WordPress設定、一般

Google Search Consoleの設定

Google Search Consoleではhttpとhttpsは別アドレスとして扱われるのでプロパティを追加して認証からやり直す必要がある。

プロパティの追加

Google Search Console プロパティの追加

https://www.souichi.club/ を入力して「追加」ボタン

httpsでアドレスを追加

以降、認証についてはAll in One SEO Packの記事を参照

Google Analyticsの設定

デフォルトのURLとビューの設定でURLをhttpからhttpsに変更する。

メニューから管理ー>プロパティ設定。

「デフォルトのURL」をhttpsに変更して保存する。

Google Analytics デフォルトのURLをhttpsに変更する

メニューから管理ー>ビューの設定

「ウェブサイトのURL」をhttpsに変更して保存する。

Google Analytics ビューの設定のURLをhttpsに変更する

Let’s Encryptの自動更新の設定

Let’s Encryptの証明書の有効期間は90日間しかない。

これには、もちろん合理的な理由があるのだけれども90日毎に手動で証明書を更新するのも面倒なので自動更新の設定をする。

テスト実行(証明書は保存されない)は以下のコマンド

sudo certbot renew --dry-run

問題がなければ、cronに登録する

sudo crontab -e
00 05 01 * * sudo certbot renew

を設定ファイルに書き込んで保存する。

crontabの設定

cronの指定方法は、

分 時 日 月 曜日 <実行コマンド>

上記は、毎曜日、毎月、1日、5時、0分にcertbotの証明書の更新を起動している。

ちなみにlogは /var/log/letsencrypt/letsencrypt.log に保存されるので次月の1日にtailコマンド確認をしてみるつもり。

以上でhttps化は完了。

証明書の更新について

2018年8月17日 追記

そろそろ証明書の有効期間が切れる頃なので以下のコマンドでlogを確認

sudo tail /var/log/letsencrypt/letsencrypt.log

「証明書がまだ更新されていない」旨のメッセージが表示されたのでcronでの設定が上手くいっていないのかと思い、念の為手動で証明書の更新を行う。

sudo certbot renew
以下のメッセージが表示された。

letsencrypt証明書の更新

「2018-10-25が有効期限なのでまだ更新されない」とのメッセージ。

最初に証明書を更新したのが6月1日頃なのでいつの間にかcronで自動更新されていた模様。

証明書の有効期限の確認

2018年10月20日追記

証明書の有効期限の確認方法について追記しておく

ブラウザからの確認

一番簡単な方法はブラウザから確認する方法

サイトにアクセスして”鍵マーク”をクリック

証明書の有効期限の確認方法

証明書をクリック

証明書(有効)をクリック

詳細タブで有効期間の終了を確認する

前回確認した時は2018年10月25日だったので12月24日まで延長された事が分かる

詳細タブで証明書の有効期限を確認

サーバーからのコマンドで確認する方法

一応、サーバーからもopensslコマンドで確認をしたので追記をしておく

1.puttyで接続

2.rootにユーザー変更

su root

3.以下のコマンド確認する

openssl x509 -in /etc/letsencrypt/live/www.souichi.club/cert.pem -noout -dates

www.souichi.clubはドメイン名

4.出力結果

証明書の有効期限の出力結果

先程のブラウザから確認した日付と同じ日付である事が分かる

Let’s Encryptに重大なバグ

2020年3月11日追記

Let’s Encryptに重大なバグが発見されて今まで発行された証明書を一旦無効にして再発行する必要が発生した。

このサイトは再発行の対象のサイトでは無かったのだが念の為、手動で証明書を再発行したので備忘録として記録しておく。

有効な証明書の2.6%(合計300万サイト)が3月4日に無効になったらしいのでお気の毒としか言いようが無い。

リンク先はQiitaのサイト。事象をわかりやすくまとめているのでありがたい。

AWS EC2にターミナルで接続して以下のコマンドで証明書を再発行する。

sudo certbot renew --force-renewal

実行結果

本日から90日間分、再発行された。

証明書の有効期間が更新された

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。