Skip to content

AmazonLinux2 で lego を使い Route53 認証でサーバ証明書を取得する

以前に lego で Let's Encrypt の証明書を Route53 DNS 認証で取得するというメモを書きました。 lego を使えば certbot をインストールすること無く、Let's Encrypt の証明書を取得出来ますので非常に手軽です。 今回は AmazonLinux2 で lego を使い、Route53 を使った DNS 認証でサーバ証明書を取得する手順をメモしておきます。

前提条件

今回は以下の環境で作業しました。

  • AWS EC2 上に作成した AmazonLinux2

IAM ポリシーの作成

以下の内容で IAM ポリシーを新規作成します。 <INSERT_YOUR_HOSTED_ZONE_ID_HERE> 部分は Route53 の管理画面で該当 DNS Zone 情報から取得します。 IAM ポリシーを作成したら、それを参照するロールを作成し、更にそれを参照するように EC2 インスタンスを設定します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
    "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 をインストールします。

1
2
3
4
5
6
7
mkdir tmp
cd tmp
wget https://github.com/go-acme/lego/releases/download/v2.6.0/lego_v2.6.0_linux_amd64.tar.gz
tar zxvf lego_v2.6.0_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 へ必要なアクセスが出来ていれば、じき終了するはずです。

1
2
3
4
5
6
lego --accept-tos \
     --path=/etc/letsencrypt \
     --email="email@example.com" \
     --dns="route53" \
     --domains="www.example.com" \
     run

サーバ証明書を更新する

サーバ証明書を更新するには renew を指定します。 また、十分な有効期限が残っているサーバ証明書は無駄に更新処理を行わないよう、--days 30 オプションを指定し、「有効期限が 30 日未満の証明書のみ、更新処理を行う」ように設定します。 あとはこの処理を cron 等で定期実行させます。 --days オプションは renew よりも後ろに指定します。

1
2
3
4
5
6
7
lego --accept-tos \
     --path=/etc/letsencrypt \
     --email="email@example.com" \
     --dns="route53" \
     --domains="www.example.com" \
     renew \
     --days 30