ACMの新機能「ACMEエンドポイント」でパブリック証明書を取得し、EC2上のNginx / Apacheに適用してみた
はじめに
2026年6月にAWS Certificate Manager (ACM) の新機能としてACMEエンドポイントが発表されました。
これにより、Certbotなどの標準的なACMEクライアントからAmazon Trust Services発行のパブリック証明書を取得できます。EC2やオンプレミスなど任意の環境で利用可能です。
従来のACM証明書と今回のACME証明書の位置づけを整理します(2026年7月時点)。なお、エクスポート可能証明書 + WCP(Workload Credentials Provider)については別記事で解説しています。
| 項目 | ACM マネージド証明書 | ACM エクスポート可能証明書 + WCP | ACM ACME 証明書 |
|---|---|---|---|
| 用途 | ALB / CloudFront / API Gateway | EC2 等でのTLS終端 | EC2 等でのTLS終端 |
| 秘密鍵の所在 | AWS管理(エクスポート不可) | WCPデーモンが配布 | クライアント側で生成・保持 |
| 証明書取得方法 | ACM API / コンソール | ACM API + WCP | ACME プロトコル(Certbot等) |
| 有効期間 | 198日(自動更新) | 198日(自動更新) | 約45日(クライアント側で更新) |
| ドメイン検証 | 発行時にDNS/Email | 発行時にDNS/Email | 管理者がドメインバリデーションを事前に設定 |
| 料金 | 無料 | $7.00/FQDN(発行・更新時) | $1.00/FQDN〜(発行・更新時、ティア制) |
ACM ACMEの特徴的な点は、ACMEクライアントによる証明書発行前に、管理者がドメインバリデーションを作成して検証を済ませておくことです。PRE_APPROVED モードではACMEクライアント側のHTTP-01やDNS-01チャレンジが発生しません。PKI管理者がドメインの所有権を事前に確認し、アプリケーション担当者はEAB(External Account Binding)資格情報を受け取るだけで証明書を取得できます。
本記事では、ACMEエンドポイントの作成からCertbotでの証明書取得、EC2上のNginx / Apacheへの適用までを一通り検証します。
検証環境
- リージョン: ap-northeast-1
- ドメイン:
acme-demo.example.com(Route 53管理) - EC2: Amazon Linux 2023 / t3.small
- ACMEクライアント: Certbot
- ウェブサーバー: Nginx、Apache(順番に検証)
ACME エンドポイントの作成
AWS CLIでACMEエンドポイントを作成します。
aws acm create-acme-endpoint \
--authorization-behavior PRE_APPROVED \
--certificate-authority '{"PublicCertificateAuthority": {"AllowedKeyAlgorithms": ["EC_prime256v1"]}}' \
--contact NOT_REQUIRED \
--region ap-northeast-1
{
"AcmeEndpointArn": "arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:acme-endpoint/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
主なパラメータは以下の通りです。
--authorization-behavior PRE_APPROVED: 事前にドメインバリデーション済みのドメインに対して証明書発行を許可するモード--certificate-authority: エンドポイントで発行を許可する証明書の鍵アルゴリズムを指定。今回はECDSA P-256のみを許可--contact NOT_REQUIRED: ACMEアカウントにメールアドレスの登録を不要にする
エンドポイントのステータスとURLを確認します。
aws acm describe-acme-endpoint \
--acme-endpoint-arn arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:acme-endpoint/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--region ap-northeast-1 \
--query "AcmeEndpoint.{Status:Status,EndpointUrl:EndpointUrl}"
{
"Status": "ACTIVE",
"EndpointUrl": "https://acm-acme-enroll.ap-northeast-1.api.aws/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/directory"
}
Statusが ACTIVE になり、EndpointUrl が払い出されました。このURLがCertbotの --server に指定するACMEディレクトリURLです。

ドメインバリデーションの設定
エンドポイントに対して、証明書を発行するドメインのバリデーションを設定します。
aws acm create-acme-domain-validation \
--acme-endpoint-arn arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:acme-endpoint/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--domain-name acme-demo.example.com \
--prevalidation-options '{"DnsPrevalidation": {"DomainScope": {"ExactDomain": "ENABLED", "Subdomains": "DISABLED", "Wildcards": "DISABLED"}, "HostedZoneId": "ZXXXXXXXXXXXXX"}}' \
--region ap-northeast-1
DomainScope で発行範囲を制御できます。今回は ExactDomain のみ有効にし、サブドメインやワイルドカードは無効にしました。HostedZoneId にRoute 53のホストゾーンを指定すると、DNS検証用のCNAMEレコードが自動的に追加されます。
ステータスを確認し、VALID になれば完了です。
aws acm describe-acme-domain-validation \
--acme-domain-validation-arn <ARN> \
--region ap-northeast-1 \
--query "AcmeDomainValidation.Status"
"VALID"
EAB 資格情報の作成
CertbotがACMEエンドポイントへ接続する際に使うEAB(External Account Binding)資格情報を作成します。EAB作成時にはIAMロールのARNを指定する必要があるため、先にロールを用意します。
IAM ロールの作成
信頼ポリシーのプリンシパルに acm-acme.amazonaws.com を指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "acm-acme.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EAB の作成
aws acm create-acme-external-account-binding \
--acme-endpoint-arn arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:acme-endpoint/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--role-arn arn:aws:iam::xxxxxxxxxxxx:role/AcmAcmeDemoIssuanceRole \
--expiration '{"Value": 1, "Type": "HOURS"}' \
--region ap-northeast-1
--expiration でEABの有効期限を設定します。これはCertbotがアカウント登録を完了するまでの猶予時間であり、証明書自体の有効期間(約45日)とは別です。今回は1時間としました。EAB作成後に資格情報(Key IDとHMAC Key)を取得します。
aws acm get-acme-external-account-binding-credentials \
--acme-external-account-binding-arn <EAB_ARN> \
--region ap-northeast-1
{
"KeyId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"MacKey": "***"
}
Certbot で証明書を取得
Amazon Linux 2023のt3.smallインスタンスを起動し、セキュリティグループでSSH(22)とHTTPS(443)を許可しました。ウェブサーバーへのアクセス確認用に、Route 53にAレコードを追加して acme-demo.example.com をインスタンスのパブリックIPに向けています。
EC2にSSH接続し、Certbotをインストールします。
sudo dnf install -y certbot
certbot certonly --standalone --non-interactive --agree-tos --register-unsafely-without-email \
--server https://acm-acme-enroll.ap-northeast-1.api.aws/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/directory \
--eab-kid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--eab-hmac-key *** \
--key-type ecdsa \
--elliptic-curve secp256r1 \
--issuance-timeout 120 \
-d acme-demo.example.com
今回のACMEエンドポイントでは EC_prime256v1 のみを許可しているため、Certbotでも --key-type ecdsa --elliptic-curve secp256r1 でECDSA P-256の鍵を明示しています。
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/acme-demo.example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/acme-demo.example.com/privkey.pem
This certificate expires on 2026-08-15.
今回のように --authorization-behavior PRE_APPROVED を指定した場合、クライアント側のHTTP-01 / DNS-01チャレンジが発生しないため、--standalone モードでもポート80を開放する必要はありませんでした。--issuance-timeout 120 はCertbotが証明書の発行完了を待つタイムアウト秒数で、ACM側の処理に時間がかかる場合に備えてデフォルト(60秒)より長めに設定しています。
証明書の内容を確認します。
openssl x509 -in /etc/letsencrypt/live/acme-demo.example.com/fullchain.pem \
-noout -subject -issuer -dates -serial
subject=
issuer=C=US, O=Amazon, CN=Amazon ECDSA 256 S08
notBefore=Jul 1 07:30:22 2026 GMT
notAfter=Aug 15 08:30:22 2026 GMT
serial=41A070DC2599391B897AC251BD279D9F
Issuerが Amazon ECDSA 256 S08 であり、Amazon Trust Services発行の証明書であることを確認できます。有効期間は約45日です。
Nginx で TLS 終端
取得した証明書をNginxに設定します。
sudo dnf install -y nginx
/etc/nginx/conf.d/ssl.conf を作成します。
server {
listen 443 ssl;
server_name acme-demo.example.com;
ssl_certificate /etc/letsencrypt/live/acme-demo.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/acme-demo.example.com/privkey.pem;
location / {
return 200 "Hello from Nginx with ACM ACME cert\n";
add_header Content-Type text/plain;
}
}
sudo systemctl start nginx
curl -sv https://acme-demo.example.com 2>&1 | grep -E '(issuer|expire|HTTP)'
* issuer: C=US; O=Amazon; CN=Amazon ECDSA 256 S08
* expire date: Aug 15 08:30:22 2026 GMT
< HTTP/1.1 200 OK
Nginxでの動作を確認できました。
Apache で TLS 終端
同じ証明書をApacheでも使えることを確認します。Nginxを停止してからApacheを起動します。
sudo systemctl stop nginx
sudo dnf install -y httpd mod_ssl
/etc/httpd/conf.d/ssl.conf の SSLCertificateFile と SSLCertificateKeyFile をCertbotの出力パスに設定します。
SSLCertificateFile /etc/letsencrypt/live/acme-demo.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/acme-demo.example.com/privkey.pem
sudo systemctl start httpd
curl -sv https://acme-demo.example.com 2>&1 | grep -E '(issuer|expire|HTTP)'
* issuer: C=US; O=Amazon; CN=Amazon ECDSA 256 S08
* expire date: Aug 15 08:30:22 2026 GMT
< HTTP/1.1 200 OK
Apacheでも同じ証明書でTLS終端できました。
ACM コンソールでの確認
ACMコンソールの「ACME certificates」タブで、発行した証明書が確認できます。

注意事項
- ALB / CloudFrontへのアタッチは不可: ACME証明書の秘密鍵はクライアント側にあるため、ALBやCloudFrontにアタッチできません。ALBでTLS終端する場合は従来のACMマネージド証明書を使用します。
- 有効期間は約45日: Let's Encrypt(90日)より短いため、自動更新の仕組みを確実に設定する必要があります。
certbot renewをcronやsystemd timerで実行する運用になります。 - 料金が発生する: ACM ACME証明書はFQDNあたり $1.00〜(ティア制)で、発行時および更新時に課金されます。ALB向けのACMマネージド証明書(無料)とは異なります。
まとめ
ACM ACMEエンドポイントにより、CertbotからAmazon Trust Servicesのパブリック証明書を取得し、EC2上のNginx / Apacheへ適用できることを確認しました。
今回のように PRE_APPROVED モードを利用する場合、管理者がACMEエンドポイントに紐づくドメインバリデーションを事前に完了させておくことで、アプリケーション担当者は発行時にHTTP-01やDNS-01のチャレンジ対応を行わずに済みます。
ALBを使わない構成でACMのエコシステムに乗りたい場合や、組織内でドメイン検証と証明書利用の役割を分離したい場合に有効な選択肢です。
参考リンク







