Let’s Encryptの証明書をRoute53とDockerで作成する

2021年11月2日

Let's Encrypt

Let's Encrypt の SSL/TSL 証明書を Amazon Route53 と Docker で作成する機会があったので備忘録。Route 53 でドメインを管理しているサイトで使える方法です。作業マシンに Docker が入っていればよいので、環境が汚れず、依存ツールのインストールなどを考えなくて良いのが楽です。

全体的な作業手順は certbot のドキュメント certbot-dns-route53’s documentation を参照しました。

目次

  1. IAM ユーザのアクセス権限の設定
  2. IAM ユーザのアクセスキーの設定
  3. 証明書の作成
  4. Route53 以外の DNS プラグイン

IAM ユーザのアクセス権限の設定

事前準備です。作業マシンで利用する IAM ユーザに Route 53 の操作権限を与えます。

IAM ユーザの詳細ページのアクセス権限タブから、インラインポリシーを以下のように設定します。YOURHOSTEDZONEID はご自身のホストゾーン ID に置き換えてください。詳細は IAM ユーザーのアクセス権限の変更 - AWS Identity and Access Management を参照。

{
    "Version": "2012-10-17",
    "Id": "certbot-dns-route53 sample policy",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "route53:GetChange"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect" : "Allow",
            "Action" : [
                "route53:ChangeResourceRecordSets"
            ],
            "Resource" : [
                "arn:aws:route53:::hostedzone/YOURHOSTEDZONEID"
            ]
        }
    ]
}

IAM ユーザのアクセスキーの設定

IAM ユーザ詳細ページの認証情報タブでアクセスキーを作成します。詳細は IAM ユーザーのアクセスキーの管理 - AWS Identity and Access Management を参照。

次に aws configureコマンドなどを利用して、~/.aws/configファイルにアクセスキーを設定します。詳細は 設定の基本 - AWS Command Line Interface を参照。

[default]
aws_access_key_id=AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key=wJalrXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

以上で事前準備は終わりです。

証明書の作成

以下のコマンドで証明書を作成します。-d オプションで指定しているドメインはご自身のものに置き換えてください。

docker run -it --rm --name certbot \
  -v $(pwd)/etc/letsencrypt:/etc/letsencrypt \
  -v $(pwd)/var/lib/letsencrypt:/var/lib/letsencrypt \
  -v ~/.aws:/root/.aws \
  certbot/dns-route53 certonly --dns-route53 \
  -d "www.example.com"

利用規約の確認やメールアドレスなどを入力してしばらく待つと、作業マシンの etc/letsencrypt/live に証明書が作成されます。

$ ls -l etc/letsencrypt/live/www.example.com

-rw-r--r--  1 karakaram  staff  692 Oct 21 09:03 README
lrwxr-xr-x  1 karakaram  staff   44 Oct 21 09:03 cert.pem -> ../../archive/www.example.com/cert1.pem
lrwxr-xr-x  1 karakaram  staff   45 Oct 21 09:03 chain.pem -> ../../archive/www.example.com/chain1.pem
lrwxr-xr-x  1 karakaram  staff   49 Oct 21 09:03 fullchain.pem -> ../../archive/www.example.com/fullchain1.pem
lrwxr-xr-x  1 karakaram  staff   47 Oct 21 09:03 privkey.pem -> ../../archive/www.example.com/privkey1.pem

証明書の更新

3 ヶ月で証明書の期限が切れるので、定期的に更新が必要です。更新も作成のときと同じコマンドで行います。

docker run -it --rm --name certbot \
  -v $(pwd)/etc/letsencrypt:/etc/letsencrypt \
  -v $(pwd)/var/lib/letsencrypt:/var/lib/letsencrypt \
  -v ~/.aws:/root/.aws \
  certbot/dns-route53 certonly --dns-route53 \
  -d "www.example.com"

更新が成功すると以下のように etc/letsencrypt/live が新しい証明書に変わります。

$ ls -l etc/letsencrypt/live/stg-cci3.git.dmm.com

-rw-r--r--  1 karakaram  staff  692 Oct 21 09:03 README
lrwxr-xr-x  1 karakaram  staff   44 Jan 18 08:07 cert.pem -> ../../archive/www.example.com/cert2.pem
lrwxr-xr-x  1 karakaram  staff   45 Jan 18 08:07 chain.pem -> ../../archive/www.example.com/chain2.pem
lrwxr-xr-x  1 karakaram  staff   49 Jan 18 08:07 fullchain.pem -> ../../archive/www.example.com/fullchain2.pem
lrwxr-xr-x  1 karakaram  staff   47 Jan 18 08:07 privkey.pem -> ../../archive/www.example.com/privkey2.pem

Route53 以外の DNS プラグイン

Route53 以外にもたくさんの DNS サービスに対応しています。certbot/certbot - Docker Image | Docker Hub に対応プラグインがあるので必要に応じて使い分けましょう。

-技術ブログ
-