らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

lego を使い Route53 認証でサーバ証明書を取得する (2020/09/27 版)

以前に以下のメモを書きました。

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