ソリッドシード株式会社

AWSとdockerでLet’s Encryptのワイルドカード証明書

2020年5月20日

当社ではLPやWordPressのサイトなどの作成で納品前にお客様が確認できるように検証用ドメインにサブドメインを発行しサイトが確認できる簡易レンタルサーバーをAWSのEC2に自社開発したのを使用しています。
確認用ですがお客様が安心して閲覧できるようにSSLの設定は必要です。
ただ、全てのドメイン1つ1つに証明書を発行するのは大変なのでワイルドカード証明書を利用しています。
今回はワイルドカード証明書についてご紹介します。

ワイルドカード証明書とは?

基本的に証明書は1ドメイン1つに紐づけられるので、例えば「test1.example.jp」や「test2.example.jp」のサブドメインは同じ「example.jp」ドメインであっても「example.jp」の証明書は利用できません。
複数のサブドメイン全てにSSLを設定すると証明書や有効期限などの管理が多くなり運用が大変になってきます。
ワイルドカード証明書は「*.example.jp」とアスタリスクを付けた同一階層のサブドメイン全てに1つのSSL証明書だけで良くなる技術で、管理コストを軽減することができます。
ワイルドカード証明書以外に、1つのSSL証明書で複数ドメインに対応できるマルチドメイン証明書というのがありますが、仕組みと機能が微妙に違うので混在しないように気を付けて下さい。

AWSで設定する場合は「certbot-dns-route53」プラグインを使用すると自動更新が可能となります。

Let’s Encryptのワイルドカード証明書

以前に無料で利用できるSSLの「Let’s Encrypt」を紹介しました。
Let’s Encryptもワイルドカード証明書が利用できます。
DNS認証で発行されるため、利用しているDNSサーバーに手動で期限が切れる前に更新するか自動で更新する仕組みが必要になります。

当社での設定環境例

例として当社がどのような環境で設定しているか紹介します。
主な設定内容は下記になります。
・サーバーはAWSのEC2にAmazon Linux 2でApacheをインストールしている。
・AWS Route 53のCNAMEレコードにワイルドカードで「*.example.jp」と対象ドメインに登録する。
・AWS IAM Management Consoleにユーザーを作成し「AmazonRoute53DomainsFullAccess」ポリシーと下記のポリシーを設定し「AWSのアクセスキー」と「AWSのシークレットアクセスキー」を取得する。

{
    "Version": "2012-10-17"
     "Statement": [
         {
             "Effect": "Allow",
             "Action": [
                 "route53:ListHostedZones",
                 "route53:GetChange"
             ],
             "Resource": [
                 "*"
             ]
         },
         {
             "Effect": "Allow",
             "Action": [
                 "route53:ChangeResourceRecordSets"
             ],
             "Resource": [
                 "arn:aws:route53:::hostedzone/[AWSホストゾーンID]"
             ]
         }
     ]
}

・docker使用して証明書を作成する。
下記の「Dockerfile」を作成する。

FROM certbot/certbot
WORKDIR /opt/certbot
RUN pip install certbot-dns-route53
COPY entrypoint.sh entrypoint.sh
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/opt/certbot/entrypoint.sh"]

下記の「entrypoint.sh」ファイルを作成する。

#!/bin/sh
certbot certonly -n \
$([ -n "${USE_STAGING_SERVER}" ] && echo "--test-cert") \
--agree-tos \
--email "${EMAIL}" \
--dns-route53 \
--dns-route53-propagation-seconds 30 \
-d "${DOMAINS}"

作成した「Dockerfile」と「entrypoint.sh」を使用して、下記のdockerコマンドを実行して証明書を作成する。
AWSのアクセスキーやドメイン名は適宜変更して下さい。

docker run -it --rm \
-v /etc/letsencrypt:/etc/letsencrypt \
-e AWS_ACCESS_KEY_ID="AWSのアクセスキー" \
-e AWS_SECRET_ACCESS_KEY="AWSのシークレットアクセスキー" \
-e EMAIL="info@example.jp" \
-e DOMAINS="example.jp,*.example.jp" certbot/dns-route53

・上記のコマンドをcronで定期的に実行

下記のサイトを参考にしております。
・Let’s Encrypt ワイルドカード certbot-dns-route53 設定手順 CentOS7
・Welcome to certbot-dns-route53’s documentation!
・Let’s Encrypt with certbot-dns-route53 (Docker)

投稿者:Saito