AWS EC2にLet’s Encryptを導入し、無料でSSL化する手順

インフラ

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

今回はEC2のSSL化に関する内容を紹介します。
EC2インスタンスにインストールされたnginxにLet’s Encryptを導入し、httpsでアクセスできることをゴールとします。

Let’s Encryptは無料でSSL化のできる人気の高いSSLサーバー証明書です。
Let’s Encryptの導入には、Let’s Encryptの公式サイトでも推奨されているCertbotと呼ばれるクライアントソフトを利用したいと思います。

こんな人におすすめの記事です
  • 無料でSSL化の準備をしたい方
  • EC2のSSL化の手順について知りたい方
  • Certbotの利用方法を知りたい方

今回利用するAWS検証環境のイメージ図

パブリックサブネットにEC2を配置した構成となっています。
EC2のマシンイメージ(AMI)は『Amazon Linux2』を利用しており、nginxのインストールとDNS設定が完了している前提となっています。

今回利用するAWS検証環境の構築手順については下記の記事を参考にしてください。

EPELパッケージのダウンロードする

EPELとはExtra Packages for Enterprise Linuxの略で、エンタープライズ Linux用の拡張パッケージです。
EPELをダウンロードすることで標準では用意されていないパッケージもインストールできるようになります。

Certbotを利用するにあたりEPELをダウンロードする必要があるため、まずはEPELの導入からはじめます。

Amazon Linux2の場合、RHEL7(Red Hat Enterprise Linux 7)用のパッケージファイルをダウンロードします。1

$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

インストールが完了したら以下のコマンドでEPELを有効化します。


### 有効化 $ sudo yum-config-manager --enable epel* ### 設定確認 $ sudo yum repolist all → 有効になっていればOK

Certbotをインストールする

以下のコマンドでCertbotおよびnginxのSSL化に必要なパッケージのインストールをします。

$ sudo yum install certbot python2-certbot-nginx

SSLサーバー証明書を作成し、nginxで利用できるようにする

CerbotでSSLサーバー証明書を作成します。

$ sudo certbot --nginx

上記のコマンドを実行すると、SSLサーバー証明書を作成するだけでなく、SSLサーバー証明書作成後にやらないといけないnginxの設定ファイルの編集などもまとめて行ってくれます。

コマンド実行中、対話形式でいくつか質問をされるので適宜回答をしていきます。
質問の中で『連絡先用メールアドレス』と『SSLサーバー証明書を発行する対象のドメイン名』を回答する必要があるため、準備しておきましょう。

最終的に以下のようなCongratulations!というメッセージが表示されればOKです。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://deliciouslif.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=deliciouslif.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

コマンド実行後、実際にnginxの設定ファイルを確認すると# managed by Certbotというコメントが記載された新しい行が追加されていることがわかります。

$ cat /etc/nginx/nginx.conf

(省略)
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/deliciouslif.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/deliciouslif.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
(省略)

なお、「nginxの設定ファイルは自分で編集したいのでSSL証明書の作成のみを実行して欲しい」という場合は上記のコマンドの代わりに以下を実行します。

$ sudo certbot certonly --nginx

動作確認

httpsでアクセスできるようになっていればOKです。鍵マークをクリックするとLet’s Encryptが有効になっていることがわかります。

SSLサーバー証明書を自動更新できるようにする

Let’s Encryptの有効期限は3ヶ月のため、SSLサーバー証明書を自動更新できるようにcrontabの編集をします。

$ echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

以下のコマンドでcrontabが正しく編集されているか確認をします。

$ sudo cat /etc/crontab
→ cronが登録されていればOK

(省略)
0 0,12 * * * root python -c...

システム用のcrontab(/etc/crontab)の設定を反映させるため、crondデーモンの再起動を行います。

$ sudo systemctl restart crond

これで自動更新の設定はOKです。

『crontab -e』で編集するcrontabはユーザー用で、『/var/spool/cron/[ユーザ名]』もしくは『/usr/lib/cron/tabs/[ユーザー名]』でファイルの参照ができます。
ユーザー用crontabの反映は編集後に自動で行われます。

crontabを誤って削除しないための対策と削除してしまった時の対処方法まとめ

まとめ

以上でEC2をSSL化する手順の紹介をおわります。

EC2(Amazon Linux2)をLet's EncryptでSSL化する手順
  1. EPELをインストール
  2. Certbotをインストール
  3. CertbotでLet’s Encryptをインストール
  4. crontabを利用してSSLサーバー証明書を自動更新できるようにする

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!

参考記事