AWS EC2 ubuntu+WordPressサイトをLet’s Encryptでhttps化するまで
Contents
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化をすることにした。
手順
全体の手順をざっくり書くと、
- https用に443のポートを空ける
- Let’s Encrypt(certbot)をインストール&設定
- 記事中の画像(メディアファイル)へのアドレスをhttpからhttpsへ変更
- WordPressの設定変更
- Google Search Consoleの設定
- Google Analyticsの設定
- Let’s Encryptの自動更新の設定
を実施した。
443のポートを空ける
AWS EC2のセキュリティグループー>インバウンドルールの編集でhttps用の443ポートを空ける
certbotのインストール
前提
- letsencryptはcertbotに名称変更している
- インストールについてはLet’s Encrypt総合ポータルを参考にした
最初は下記のコマンドで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を選択。
HTTPで接続してきた時にHTTPSにリダイレクトする(HTTP接続を無くす)かどうかの選択。
2.のHTTPSにリダイレクトするを選択する。
以下のメッセージが表示されてapacheへのインストール(設定)が成功した。
/etc/apache2/sites-availableにmain-le-ssl.confが新たに作成されていた。
またmain.confが編集されていてリダイレクトの設定が入っていた。
apacheの再起動
apacheを再起動してhttpsでの接続を確認した。
sudo service apache2 restart
画像(メディアファイル)へのアドレスを変更
サイトはhttpsに対応したが記事中の画像(メディアファル)のアドレスがhttpのままなので画像を拡大表示している時のアドレス欄が保護された通信になっていない。
Really Simple SSLなどのプラグインのインストールも一瞬考えたのだけれども記事数も少ないのでテキストエディターで1記事づつ変換することにした。
プラグインししなかったのは過去の画像のURLの変換の為だけにインストールするプラグインを増やしたくなかったから。
記事を一つづつ呼び出してエディターに貼り付けてhttpからhttpsへ一括変換して、元の記事に貼り付けて保存を繰り返す。
30分位で終わったけど面倒な人はプラグインを使ったほうが楽かも。
WordPressの設定変更
WordPressのメニューから設定ー>一般
「Wordpress アドレス(URL)」と「サイトアドレス(URL)」をhttpからhttpsに変更して保存する。
Google Search Consoleの設定
Google Search Consoleではhttpとhttpsは別アドレスとして扱われるのでプロパティを追加して認証からやり直す必要がある。
プロパティの追加
https://www.souichi.club/ を入力して「追加」ボタン
以降、認証についてはAll in One SEO Packの記事を参照
Google Analyticsの設定
デフォルトのURLとビューの設定でURLをhttpからhttpsに変更する。
メニューから管理ー>プロパティ設定。
「デフォルトのURL」をhttpsに変更して保存する。
メニューから管理ー>ビューの設定
「ウェブサイトの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
を設定ファイルに書き込んで保存する。
cronの指定方法は、
分 時 日 月 曜日 <実行コマンド>
上記は、毎曜日、毎月、1日、5時、0分にcertbotの証明書の更新を起動している。
ちなみにlogは /var/log/letsencrypt/letsencrypt.log に保存されるので次月の1日にtailコマンド確認をしてみるつもり。
以上でhttps化は完了。
証明書の更新について
そろそろ証明書の有効期間が切れる頃なので以下のコマンドでlogを確認
sudo tail /var/log/letsencrypt/letsencrypt.log
「証明書がまだ更新されていない」旨のメッセージが表示されたのでcronでの設定が上手くいっていないのかと思い、念の為手動で証明書の更新を行う。
sudo certbot renew
「2018-10-25が有効期限なのでまだ更新されない」とのメッセージ。
最初に証明書を更新したのが6月1日頃なのでいつの間にかcronで自動更新されていた模様。
証明書の有効期限の確認
証明書の有効期限の確認方法について追記しておく
ブラウザからの確認
一番簡単な方法はブラウザから確認する方法
サイトにアクセスして”鍵マーク”をクリック
証明書をクリック
詳細タブで有効期間の終了を確認する
前回確認した時は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に重大なバグ
Let’s Encryptに重大なバグが発見されて今まで発行された証明書を一旦無効にして再発行する必要が発生した。
このサイトは再発行の対象のサイトでは無かったのだが念の為、手動で証明書を再発行したので備忘録として記録しておく。
有効な証明書の2.6%(合計300万サイト)が3月4日に無効になったらしいのでお気の毒としか言いようが無い。
AWS EC2にターミナルで接続して以下のコマンドで証明書を再発行する。
sudo certbot renew --force-renewal
本日から90日間分、再発行された。
最近のコメント