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: 証明書をリクエストする
マネジメントコンソール
- リージョンを確認する(CloudFront 用なら us-east-1 に切り替え)
- ACM →「証明書をリクエスト」→「パブリック証明書をリクエスト」
- ドメイン名を入力(
example.com、必要なら*.example.comも追加) - 検証方法で「DNS 検証」を選択
- 「リクエスト」
ステータスが「検証保留中(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つです。
- CloudFront 用は us-east-1 固定、それ以外はリソースと同じリージョン
- Route 53 なら DNS 検証をワンクリックで設定でき、自動更新が効く
- 検証用 CNAME は消さない(自動更新のため)
証明書の期限切れは気づきにくく影響の大きいトラブルです。ACM に寄せられる部分は寄せてしまうのが、運用負荷を下げる近道です。
