5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ACMの証明書をエクスポートして EC2で使う

5
Posted at

2025/06/17 のアップデートで、AWS Certificate Manager (ACM) の 「エクスポート可能なパブリック証明書」 が登場しました。
これにより、ACMで発行した証明書を EC2 上の Apache に“ファイルとして配置して使う” ことができます。

本記事では、ACM → エクスポート → EC2(Apache) でTLS終端までの最小手順と、運用上の落とし穴をまとめます。


背景:なぜ以前は「ACMをEC2へアタッチ」できなかった?

従来のACMパブリック証明書は、秘密鍵をユーザーが取り出せない設計でした。
そのため CloudFront / ELB などのACM統合サービスでの利用が中心で、EC2上のApache/Nginxに「鍵ファイルとして」置いて使うことはできませんでした。


2025/06/17:ACM「エクスポート可能」パブリック証明書とは

新機能により、ACMで「エクスポート可能」として発行したパブリック証明書は、次をエクスポートできます。

  • Certificate(証明書本体)
  • CertificateChain(中間証明書チェーン)
  • PrivateKey(パスフレーズで暗号化された秘密鍵

重要な制約(ここは必ず押さえる)

  • 2025/06/17以前に作成したACMパブリック証明書はエクスポート不可
  • エクスポート可能証明書は 追加課金($15/FQDN, $149/ワイルドカード。発行時+更新時)
  • 有効期間は 395日(約13ヶ月)
  • ACMが更新しても、EC2へ自動配布はされない(自分で配布の自動化が必要)

想定構成

  • 証明書:ACM(エクスポート可能なパブリック証明書)
  • Webサーバ:EC2 + Apache(mod_ssl)
  • ドメイン検証:DNS検証(推奨)

手順1:ACMで「エクスポート可能」な証明書を発行

ACMコンソールで「Request certificate」→「Public certificate」→ Allow export: Enable を選んで発行します。

Disable のまま発行すると、後から export を有効化できません。

DNS検証を選ぶと、更新運用が比較的ラクです。


手順2:CLIで証明書をエクスポート(PEMを取得)

2-1. パスフレーズファイルを作る(末尾改行なし)

パスフレーズをファイルで渡すと、コマンド履歴に残らず安全です。
注意:パスフレーズファイルは末尾に改行(line terminator)があると失敗します。

printf '%s' 'YOUR_STRONG_PASSPHRASE' > passphrase.txt

2-2. export-certificate でエクスポート

CERT_ARN="arn:aws:acm:ap-northeast-1:123456789012:certificate/xxxx..."

aws acm export-certificate \
  --certificate-arn "$CERT_ARN" \
  --passphrase fileb://passphrase.txt \
  > export.json

2-3. JSONからファイルに分割

jq -r .Certificate export.json > cert.pem
jq -r .CertificateChain export.json > chain.pem
jq -r .PrivateKey export.json > privkey_encrypted.pem

# Apacheでは fullchain を使うことが多いので連結
cat cert.pem chain.pem > fullchain.pem

手順3:Apacheで扱いやすい秘密鍵にする(復号して配置する例)

ACMから出る PrivateKey は暗号化されています。Apache運用では「復号して配置」を選ぶことが多いです(再起動時の手入力を避けるため)。

openssl pkcs8 \
  -in privkey_encrypted.pem \
  -passin file:passphrase.txt \
  -out privkey.key \
  -nocrypt

当然ですが、復号後の秘密鍵は漏洩リスクが上がるので、後述の権限/保管を徹底してください。


手順4:EC2(Apache)に配置して設定

以下は例として Amazon Linux系(dnf)で記載します。

4-1. Apache / mod_ssl の導入

sudo dnf install -y httpd mod_ssl
sudo systemctl enable --now httpd

4-2. 証明書を配置(権限が超重要)

sudo install -o root -g root -m 0644 fullchain.pem /etc/pki/tls/certs/example.com.fullchain.pem
sudo install -o root -g root -m 0600 privkey.key /etc/pki/tls/private/example.com.key

4-3. VirtualHost(443)設定

例:/etc/httpd/conf.d/ssl-example.com.conf

<VirtualHost *:443>
  ServerName example.com
  DocumentRoot /var/www/html

  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/example.com.fullchain.pem
  SSLCertificateKeyFile /etc/pki/tls/private/example.com.key

  # 環境に合わせて調整(例:古いプロトコルは無効化)
  SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>

反映:

sudo apachectl configtest
sudo systemctl restart httpd

運用の落とし穴:更新は“自動配布されない”

エクスポート可能証明書は、ACM側で更新(renewal)できますが、EC2へ置いたファイルは自動で置き換わりません

つまり運用としては、

  1. 更新イベントを検知(例:EventBridge)
  2. 再エクスポート
  3. EC2へ配布(例:SSM Run Command / デプロイツール)
  4. Apache reload / restart

…の仕組みを作るのが基本です。

AWS Security Blog では EventBridge をトリガーに、複数の配布先(EC2やハイブリッド環境)へ自動配布する例も紹介されています。


セキュリティ注意点(最低限)

  • acm:ExportCertificate を許すと、秘密鍵の持ち出しが可能になります。IAMは最小権限に。
  • 復号済み秘密鍵は rootのみ(600)、バックアップ/転送/保管(S3やSecrets Manager等)も暗号化+アクセス制御。
  • エクスポート可能証明書は、必要に応じて 失効(revocation) も検討(鍵漏洩対策)。

料金メモ(見落としがち)

  • 従来の 非エクスポート ACMパブリック証明書:追加費用なし
  • エクスポート可能
    • $15 / 標準FQDN(発行時 + 更新時)
    • $149 / ワイルドカード(発行時 + 更新時)
    • export-certificate API は月 10,000 回まで無料(以降は段階課金)

「EC2で直接TLS終端が本当に必要か?」を含め、用途に応じて選ぶのがおすすめです。


まとめ

  • 2025/06/17以降、ACMで エクスポート可能なパブリック証明書を発行し、EC2(Apache)で利用できるようになりました。
  • ただし 既存証明書はエクスポート不可。新規発行時に「Enable export」を選ぶ必要があります。
  • 更新はACMが行えても、配布は自分で自動化するのがポイントです。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?