以前に以下のメモを書きました。
lego を使えば certbot をインストールすること無く、Let's Encrypt の証明書を取得出来ますので非常に手軽です。 lego のバージョンは前回のメモ時点で 2.6.0 だったのですが、現時点の最新は 4.0.1 の為、改めてメモを書き直しておきます。 但し、バージョンによる差異が全く無い為、手順は全く同じです。 また、メモの最後にワイルドカード証明書を発行 / 更新する場合のメモを追加しておきました。
前提条件
今回は以下の環境で作業しました。
- AWS EC2 上に作成した AmazonLinux2
IAM ポリシーの作成
以下の内容で IAM ポリシーを新規作成します。 <INSERT_YOUR_HOSTED_ZONE_ID_HERE>
部分は Route53 の管理画面で該当 DNS Zone 情報から取得します。 IAM ポリシーを作成したら、それを参照するロールを作成し、更にそれを参照するように EC2 インスタンスを設定します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "route53:GetChange", "route53:ListHostedZonesByName", "route53:ListResourceRecordSets" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/<INSERT_YOUR_HOSTED_ZONE_ID_HERE>" ] } ] }
インストール
AmazonLinux2 上で lego をインストールします。
mkdir tmp cd tmp wget https://github.com/go-acme/lego/releases/download/v4.0.1/lego_v4.0.1_linux_amd64.tar.gz tar zxvf lego_v4.0.1_linux_amd64.tar.gz mv lego /usr/local/bin/ chmod 755 /usr/local/bin/lego chown root:root /usr/local/bin/lego
サーバ証明書を取得する
lego を使い、サーバ証明書を取得します。 IAM ポリシーが適切に設定され、EC2 インスタンスから該当 DNS Zone へ必要なアクセスが出来ていれば、じき終了するはずです。
/usr/local/bin/lego \ --accept-tos \ --path=/etc/letsencrypt \ --email="email@example.com" \ --dns="route53" \ --domains="www.example.com" \ run
サーバ証明書を更新する
サーバ証明書を更新するには renew
を指定します。 また、十分な有効期限が残っているサーバ証明書は無駄に更新処理を行わないよう、--days 30
オプションを指定し、「有効期限が 30 日未満の証明書のみ、更新処理を行う」ように設定します。 あとはこの処理を cron 等で定期実行させます。 --days
オプションは renew
よりも後ろに指定します。
/usr/local/bin/lego \ --accept-tos \ --path=/etc/letsencrypt \ --email="email@example.com" \ --dns="route53" \ --domains="www.example.com" \ --days 30 \ renew
ワイルドカード証明書を発行 / 更新する場合
ワイルドカード証明書を発行する場合は --domains
オプションに *.example.com
を含めます (ドメイン部分は実際のドメインに合わせます)。
/usr/local/bin/lego \ --accept-tos \ --path=/etc/letsencrypt \ --email="email@example.com" \ --dns="route53" \ --domains="www.example.com" \ --domains="*.example.com" \ run
同様に、ワイルドカード証明書を更新する場合は以下を実行します。
/usr/local/bin/lego \ --accept-tos \ --path=/etc/letsencrypt \ --email="email@example.com" \ --dns="route53" \ --domains="www.example.com" \ --domains="*.example.com" \ --days 30 \ renew