やりたいこと
- Let'sEncryptを利用して、無料でSSLサーバ証明書を発行しSSL化する
- CRONを設定して、サーバ証明書を自動更新する
サーバ証明書
- ウェブサイトで HTTPS (SSL/TLS) を有効にするために必要なデジタル証明書
Let'sEncryptについて
- ドメイン名を持っている人なら、誰でも無料でサーバ証明書を発行してくれる認証局
- 有効期限は90日間
Certbotについて
- 証明書を発行するための、クライアントソフト
- 設定も自動で編集してくれる
環境
- EC2
- nginx/1.20.0
- certbot 1.11.0
- Nginxインストール済み、DNS設定済み
1. EPELパッケージをインストール
Certbotを利用するにあたりEPELをダウンロードする必要がある。
EPEL(Extra Packages for Enterprise Linux)
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
2. インストールしたEPELを有効化
$ sudo yum-config-manager --enable epel*
3. Certbotをインストール
nginxのSSL化に必要なパッケージもインストール
$ sudo yum -y install certbot python2-certbot-nginx
$ sudo yum -y install certbot
(普通にインストール)
4. サーバ証明書を発行
下記のコマンドで、証明書を発行してNginxの設定も自動で編集してくれる
$ sudo certbot --nginx
※ 証明書のみ発行したい場合
$ sudo certbot certonly --nginx
5.HTTPSが有効になったか確認
(1) Nginxの設定ファイル
$ view /etc/nginx/conf.d/hostname.conf
HTTPS通信に必要な設定が追記されている。
+ listen 443 ssl;
+ ssl_certificate /etc/letsencrypt/live/hostname.net/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/hostname.net/privkey.pem;
+ include /etc/letsencrypt/options-ssl-nginx.conf;
+ ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
...
+ server {
+ if ($host = hostname.net) {
+ return 301 https://$host$request_uri;
+ } # managed by Certbot
+ listen 80;
+ server_name hostname.net;
+ return 404; # managed by Certbot
(2) Let'sEncryptから発行された証明書の有効期限を確認
$ sudo openssl x509 -in /etc/letsencrypt/live/hostname.net/fullchain.pem -noout -dates
証明書の有効期限は、90日後になっている。
notBefore=Dec 15 02:21:26 2021 GMT #発行日 12月15日
notAfter=Mar 15 02:21:25 2022 GMT #有効期限 3月15日
6.証明書を自動更新設定
Let'sEncryptの有効期限は3ヶ月のため、証明書を
自動更新されるようにCRONを設定する
CRON = 指定した時間に、指定したプログラムを動かしてくれる仕組み
* | * | * | * | * |
---|---|---|---|---|
分 | 時 | 日 | 月 | 曜日 |
毎日、12:00に$ certbot renew -q
を実行
( -q | --quiet ) = エラーを除くすべての出力を行なわない。(エラーメッセージのみを出力)
$ 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
設定を反映させるため再起動
$ sudo systemctl restart crond
crontabが編集されているか確認
$ sudo cat /etc/crontab
0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q
手動で更新する場合
証明書を更新する
$ sudo certbot renew
※ 証明書の更新は、有効期限から30日切っていないと更新できない
30日切っていなくても、強制的に更新する場合は
$ sudo certbot renew --force-renew
で可能
Let'sEncrypt証明書の制限について
- 登録ドメインごとの証明書数の制限は、1週間に50個まで。
公式サイト{www.example.com の場合、登録ドメインは example.com です。 new.blog.example.co.uk の場合、登録ドメインは example.co.uk になります。
}
- 検証の失敗は、1時間につき5回まで。
公式サイト{検証の失敗は、1アカウントごと、1ホスト名ごと、1時間毎に、5回までに制限されています。 この制限はステージング環境では緩和されているため、接続の問題をデバッグする場合には、こちらを使ってください
}