SSLならセクティゴ・コモドのEV・企業・ドメイン認証

SSLならセクティゴ・コモドのEV・企業・ドメイン認証

サポート


こちらからサポート記事を検索いただけます

検索キーワード:

注文・設定方法など (CaaS関連)

AWS (Route 53)に対してDNSチャレンジ方式で自動で証明書を取得しALBのリスナーに自動で証明書を適用する方法

Certbotを利用しRoute 53に認証設定を設定し、自動取得した証明書をELBに自動設定する方法


1. Route 53でのTXTレコード自動設定 (Certbotプラグイン)


ACMEクライアントとして最も普及している「Certbot」を利用するのが一般的です。Certbotには、AWS Route 53と連携するための専用プラグインがあります。

1.1.前提条件


AWS IAMユーザー/ロールの準備: CertbotがRoute 53のDNSレコードを操作するための権限を持つIAMユーザーまたはIAMロールが必要です。以下の権限を付与したポリシーを作成し、Certbotを実行する環境(EC2インスタンスなど)にアタッチします。
route53:ListHostedZones ホストゾーンの一覧を取得する権限
route53:GetChange DNSレコードの変更が完了したか確認する権限
route53:ChangeResourceRecordSets TXTレコードを自動的に追加・削除する権限

AWS認証情報の準備CertbotがAWS APIにアクセスできるよう、以下のいずれかの方法で認証情報を設定します。

IAMロール EC2インスタンスにIAMロールをアタッチする事を推奨します。認証情報は自動的に引き継がれます。
環境変数 AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを設定します。
クレデンシャルファイル ~/.aws/credentialsに認証情報を設定します。

1.2.CertbotとRoute 53プラグインのインストール


使用しているOS(Ubuntu, CentOSなど)に応じて、CertbotとそのRoute 53プラグインをインストールします。

コマンド実行例


# Ubuntuの場合
sudo apt-get update
sudo apt-get install certbot python3-certbot-dns-route53

# CentOSの場合
sudo yum install certbot python3-certbot-dns-route53

1.1.1.3. EAB(External Account Binding)と証明書の取得


SectigoのようなACMEプロバイダーでは、外部アカウントバインディング 通称;EAB (External Account Binding)が要求されます。EABを利用することで、アカウントを事前に作成し、そのアカウントに紐づいた証明書を発行できます。

EABの情報(キーIDとhmacキー)は、ACMEプロバイダー(Sectigo)から取得します。

以下のコマンドで証明書を取得します。

ドメイン認証タイプ取得のコマンド実行例

sudo certbot certonly \
--dns-route53 \
--dns-route53-propagation-seconds 60 \
-d "example.com" -d "*.example.com" \
--server https://acme.sectigo.com/v2/DV \
--eab-kid Sectigo Japanから提供されるEABのキーID \
--eab-hmac-key Sectigo Japanから提供されるEABのHMACキー
コマンド解説:
certonly 証明書の取得のみを行い、ウェブサーバーの設定は変更しません。
--dns-route53 Route 53プラグインを使用することを指定します。
--dns-route53-propagation-seconds 60: DNSレコードの伝播を待つ時間を指定(デフォルトは10秒)します、Route 53の伝播には時間がかかる場合があるため、60秒程度に設定することをお勧めします。
※Certbotの新しいバージョンでは--dns-route53-propagation-secondsオプションが不要になってます!
最新のCertbotでは、DNSレコードの伝播(propagation)が完了するまで自動的に待機する仕様になったため手動で秒数を指定する必要がなくなりました。もしも警告が出る場合にはこちらの指定を削除してください
-d "example.com"
-d "*.example.com":
証明書を取得したいドメインを引数-d で指定します。ワイルドカード証明書(*.example.com)を取得する場合は、DNSチャレンジが必須となります
--server セクティゴACMEプロバイダーのディレクトリURLを指定します。
ドメイン認証タイプなら https://acme.sectigo.com/v2/DV
企業認証タイプなら https://acme.sectigo.com/v2/OV
--eab-kid Sectigo Japanから提供されるEABのKey IDを指定します。
--eab-hmac-key Sectigo Japanから提供されるEABのHMACキーを指定します。

このコマンドを実行すると、Certbotは自動的にRoute 53に_acme-challengeのTXTレコードを作成し、ACMEプロバイダーによるドメイン認証が成功すると、証明書が/etc/letsencrypt/live/example.com/などに保存されます。

2. ELBへの証明書自動設定

Certbotは証明書の取得と更新は自動化できますが、取得した証明書をELBに自動的に適用する機能は標準ではありません。このプロセスは、Certbotの--deploy-hookを利用してスクリプトを呼び出すことで自動化します。

2.1. 必要なIAM権限

ELB(Application Load Balancer: ALB)のリスナーに証明書を適用するため、以下のIAM権限を持つIAMユーザー/ロールが必要です。

acm:ImportCertificate 証明書をAWS Certificate Manager (ACM)にインポートする権限
acm:ListCertificates ACMにインポートされた証明書の一覧を取得する権限
elasticloadbalancing:SetCertificate
または
elasticloadbalancing:AddListenerCertificate
ELBリスナーに証明書を設定する権限

2.2. デプロイフックスクリプトの作成


Certbotが証明書を更新した際に実行されるデプロイフックスクリプトを作成します。このスクリプトは、新しい証明書をACMにインポートし、ALBのリスナーに適用する役割を担います。

スクリプト例 (/path/to/your/deploy-hook.sh)

Bashスクリプト例

#!/bin/bash

# ドメイン名
DOMAIN=example.com

# ALBのリスナーARN
LISTENER_ARN="arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/your-alb-name/abcdefg"

# 証明書ファイルのパス (Certbotによって設定される)
CERT_PATH="/etc/letsencrypt/live/$DOMAIN/fullchain.pem"
PRIVKEY_PATH="/etc/letsencrypt/live/$DOMAIN/privkey.pem"


# ACMに証明書をインポート
# 既存の証明書がある場合、それを更新するために事前にARNを取得する
CERT_ARN=$(aws acm list-certificates --query "CertificateSummaryList[?DomainName==`"$DOMAIN"`].CertificateArn" --output text)


if [ -z "$CERT_ARN" ]; then
echo "Importing new certificate to ACM..."
CERT_ARN=$(aws acm import-certificate \
--certificate file://$CERT_PATH \
--private-key file://$PRIVKEY_PATH \
--query CertificateArn --output text)
else
echo "Updating existing certificate in ACM with ARN: $CERT_ARN"
aws acm import-certificate \
--certificate file://$CERT_PATH \
--private-key file://$PRIVKEY_PATH \
--certificate-arn "$CERT_ARN"
fi

# 証明書が正しくインポートされたか確認
if [ -z "$CERT_ARN" ]; then
echo "Failed to import certificate to ACM."
exit 1
fi

echo "Certificate ARN: $CERT_ARN"

# ALBのリスナーに新しい証明書を適用
echo "Setting new certificate on ELB listener: $LISTENER_ARN"
aws elbv2 modify-listener \
--listener-arn "$LISTENER_ARN" \
--certificates CertificateArn="$CERT_ARN"

echo "Certificate update complete."


2.3. Certbotコマンドへのデプロイフックスクリプトの追加

Certbotのrunまたはrenewコマンドに、作成したスクリプトを--deploy-hookオプションで追加します。

コマンド実行例

# 初回取得時
sudo certbot certonly \
--dns-route53 \
-d "example.com" -d "*.example.com" \
--server https://acme-v02.api.sectigo.com/directory \
--eab-kid Sectigo Japanから提供されるEABのキーID \
--eab-hmac-key Sectigo Japanから提供されるEABのHMACキー
--deploy-hook /path/to/your/deploy-hook.sh
このコマンドで証明書を取得すると、自動的にデプロイフックスクリプトが実行され、ELBに証明書が適用されます。

2.4. 自動更新の設定

Certbotは通常、証明書の有効期限が切れる前に自動更新を実行するよう、cronやsystemd timerに設定されます。

CRON設定例



# cron.d に設定する場合の例
# 毎日午前3時に自動更新を試行
0 3 * * * root certbot renew --quiet --deploy-hook /path/to/your/deploy-hook.sh

この設定により、証明書が更新されるたびに--deploy-hookが実行され、ELB上の証明書も自動的に最新のものに置き換わります。

サポートトップへ

CaaSとは

注文・設定方法など

トラブルシューティング

その他