ACM で SSL 証明書を無料取得する

概要

AWS Certificate Manager(ACM)は、AWS が提供する SSL/TLS 証明書を無料で発行・管理できるサービスです。DNS 検証で取得すれば自動更新にも対応するため、「90日ごとに更新を回す」といった運用の手間がかかりません。

この記事では、ACM でパブリック証明書を取得し、CloudFront や ALB に紐付けるまでの手順をハンズオン形式でまとめます。DNS 検証(Route 53)を前提に、再現できる形で解説します。

ACM を使う前に押さえておくべき前提

1. 証明書ファイルは取り出せない

ACM のパブリック証明書は秘密鍵をエクスポートできません。自前の EC2 に nginx を立てて証明書ファイルを置く、といった使い方はできません。

利用先は主に以下の AWS マネージドサービスに限られ、「証明書ファイルをダウンロードして使う」のではなく「AWS リソースに ARN で関連付ける」形になります。

  • CloudFront
  • Application Load Balancer(ALB) / Network Load Balancer(NLB)
  • API Gateway
  • App Runner など

2. CloudFront 用はバージニア北部(us-east-1)固定

最大の落とし穴です。

  • CloudFront に付ける証明書は、必ず us-east-1(バージニア北部)で発行する
  • ALB / API Gateway に付ける証明書は、そのリソースと同じリージョンで発行する

東京リージョン(ap-northeast-1)で CloudFront 用の証明書を発行すると、CloudFront の設定画面で証明書が一切選べません。用途を決めてから発行しましょう。

3. DNS 検証とメール検証

検証方法 特徴
DNS 検証 CNAME を1つ追加。自動更新が効くので推奨
メール検証 ドメイン管理者宛メールで承認。更新のたびに手作業が発生しがち

Route 53 で管理しているなら DNS 検証一択です。

環境

  • AWS アカウント(ACM / Route 53 の権限がある IAM)
  • Route 53 で管理しているドメイン(例: example.com)
  • AWS CLI v2

手順1: 証明書をリクエストする

マネジメントコンソール

  1. リージョンを確認する(CloudFront 用なら us-east-1 に切り替え)
  2. ACM →「証明書をリクエスト」→「パブリック証明書をリクエスト」
  3. ドメイン名を入力(example.com、必要なら *.example.com も追加)
  4. 検証方法で「DNS 検証」を選択
  5. 「リクエスト」

ステータスが「検証保留中(Pending validation)」になります。

CLI

aws acm request-certificate \
  --domain-name example.com \
  --subject-alternative-names "*.example.com" \
  --validation-method DNS \
  --region us-east-1 \
  --query CertificateArn \
  --output text

返ってきた ARN を控えます。

arn:aws:acm:us-east-1:123456789012:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

手順2: DNS 検証用の CNAME を追加する

Route 53 ならワンクリック

証明書の詳細画面にある「Route 53 でレコードを作成」ボタンを押すだけで、検証用 CNAME がホストゾーンに自動追加されます。

CLI で検証レコードを確認する

aws acm describe-certificate \
  --certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/xxxx..." \
  --region us-east-1 \
  --query "Certificate.DomainValidationOptions[].ResourceRecord"

出力例(値はダミー):

[
  {
    "Name": "_abc123.example.com.",
    "Type": "CNAME",
    "Value": "_def456.acm-validations.aws."
  }
]

この Name / Value を Route 53 に CNAME として登録すれば検証が通ります。

手順3: 検証完了を待つ

CNAME 追加後、通常は数分〜十数分で証明書が発行されます。ステータスが「発行済み(Issued)」になれば完了です。

CLI でポーリングするなら:

aws acm wait certificate-validated \
  --certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/xxxx..." \
  --region us-east-1

検証完了までブロックして待ち、完了で終了コード 0 を返します。CI/CD への組み込みに便利です。

実装例: CloudFront に紐付ける

  • 「Custom SSL certificate」で発行した ACM 証明書を選択
  • 「Alternate domain names(CNAMEs)」に example.com を入力
  • Route 53 の A レコード(エイリアス)を CloudFront ディストリビューションに向ける

証明書が選択肢に出てこない場合は、ほぼ確実にリージョンの取り違えです。CloudFront は us-east-1 の証明書しか参照しません。

実装例: ALB に紐付ける

ALB と同じリージョンで発行した証明書を、HTTPS リスナー(443)のデフォルト証明書に指定します。

aws elbv2 create-listener \
  --load-balancer-arn "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/my-alb/xxxx" \
  --protocol HTTPS \
  --port 443 \
  --certificates CertificateArn="arn:aws:acm:ap-northeast-1:123456789012:certificate/yyyy..." \
  --default-actions Type=forward,TargetGroupArn="arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-tg/zzzz"

確認方法

# ステータス確認
aws acm describe-certificate \
  --certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/xxxx..." \
  --region us-east-1 \
  --query "Certificate.Status"
# => "ISSUED"

# HTTPS 接続で証明書を確認
curl -vI https://example.com 2>&1 | grep -i "issuer"

ブラウザで鍵マークが表示され、発行者が「Amazon」になっていれば成功です。

注意点

  • 自動更新の条件: DNS 検証で発行し、検証用 CNAME をホストゾーンに残したままにしておくこと。消すと自動更新に失敗します。
  • リージョンの使い分け: CloudFront = us-east-1、それ以外 = リソースと同じリージョン。
  • ワイルドカードの範囲: *.example.com は1階層のサブドメインのみカバー。a.b.example.com は対象外。
  • 証明書の削除: リソースに紐付いている証明書は削除できません。先に関連付けを外します。

まとめ

ACM を使えば、SSL/TLS 証明書を無料で取得・自動更新できます。ポイントは3つです。

  1. CloudFront 用は us-east-1 固定、それ以外はリソースと同じリージョン
  2. Route 53 なら DNS 検証をワンクリックで設定でき、自動更新が効く
  3. 検証用 CNAME は消さない(自動更新のため)

証明書の期限切れは気づきにくく影響の大きいトラブルです。ACM に寄せられる部分は寄せてしまうのが、運用負荷を下げる近道です。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。