こんにちは。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の反映は編集後に自動で行われます。
まとめ
以上でEC2をSSL化する手順の紹介をおわります。
- EPELをインストール
- Certbotをインストール
- CertbotでLet’s Encryptをインストール
- crontabを利用してSSLサーバー証明書を自動更新できるようにする
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!