Amazon Lightsail サーバ構築のSSL化(Let’s Encrypt利用)

前回DNS設定をしてhttpで独自ドメインアクセスできるようにしましたので今回はSSL化(https)をします。

プロダクトとして無料でSSL証明書を発行してくれるLet’s Encryptを利用することとします。

Let’s Encryptについて

(ウィキペディアから引用)

Let’s Encryptは、すべてのWebサーバへの接続を暗号化することを目指したプロジェクトだそうで主要スポンサーとしてEFFMozillaアカマイシスコなど名立たる団体がおり、下手なSSL発行業者よりも断然信頼性があるかと思われます。有効期間は3か月と短いですが証明書更新は完全に自動化できますので全く問題がないと思います。

ワイルドカード証明書にも対応しているようです。(私は1つしかサイトをもってませんので個別ドメインの証明書発行で進めます)

(重要)作業を始める前にバックアップ

この作業ですが手順をどこかでミスったらapacheが立ち上がらなくなったりしますので、必ず作業前にスナップショットを取っておいてください。

Let’s Encryptのダウンロードします

SSH接続してホームディレクトリからgit cloneコマンドにてダウンロードします。(gitコマンドは最初から使えると思います。)

証明書発行コマンドを実行します

※blog.miminoinu.netの部分は自分のドメインに読み替えてください。

これで/etc/letsencrypt/live/ドメイン名/配下にfullchain.pem(フルチェイン証明書)とprivkey.pem(自分サーバの秘密鍵)が出力されます。
これをapacheが参照しているファイルと置き換えます。

bitnamiでは最初からSSL関連の設定がされていてファイルを置き換えればよい状態になっているのでこれだけです。簡単ですね。

ここまでできたら一度apacheを再起動して動作確認をします。

apacheが正常に起動することを確認したら、SSL化できているか確認します。

http://35.196.206.91/

にブラウザからアクセスし、セキュリティ警告等が出ていないことを確認します。

 アドレスバーの横の鍵マークが赤くなっていないこと。

証明書の有効期限3か月後となっていること。

ひとまずこれでSSL化はできました。次に証明書の自動更新設定をします。

SSL証明書の自動更新

やり方として、このサーバにバッチファイルを作成してそれをcronで自動起動するようにします。

1か月に1回起動させて証明書更新をします。(常に2か月は余裕がある状態とします。)

バッチファイル(ssl_key_update.shという名前とします)の内容はこのような感じです。

5行目と6行目について説明します。

今6行目が有効化されています。対してコメントアウト状態の5行目ですが最後尾に–dry-runというパラメータがついてます。
–dry-runパラメータが付加されるとテスト実行となり実際のサーバ証明書はディスクに保存されません。

なのでバッチを作る際は必ず最初に5行目を有効化し6行目をコメントアウトして実行テストを行ってください。
※–dry-runなしで何度も実行すると証明書の取得回数制限オーバーで取れなくなる可能性があります。

ファイルに実行権限をつけてまずは手動実行してみます。
↓実行結果

テスト実行なので実際に証明書の再取得はされませんが、その後のコピー処理とapache再起動も含めてうまく動くことを確認できました。

次に1か月に1回自動起動する設定をします。

cron設定

crontabコマンドの-eでcronファイルの編集モードにして最終行に次の1行を追加します。

※毎月1日、AM05:00に先ほどのバッチを起動するようにします。
実行結果をssl_key_update.logという名前でログ出力する形にしています。

cronがきちんと指定された時刻に動くかどうかのテストを最初は0 5 1の部分をいじって実施すると思います。
そのためにも–dry-runオプションは必須です。

cron起動の確認も無事済んだら最後にバッチファイルのコメントアウト状態を元に戻して–dry-runオプションを外します。