ACM パブリック証明書をエクスポートして EC2 上の Nginx で TLS 終端してみた
こんにちは、岩城です。
re:Inforce 2025 期間中に、ACM パブリック証明書をエクスポートできるようになりました。
[アップデート] Amazon Certificate Managerで証明書がエクスポートできるようになりました | DevelopersIO
案件対応中、稀に EC2 インスタンスで TLS を終端したい時があります。
これまでは、オレオレ証明書(自己署名証明書)や各認証局から発行された証明書を利用していました。
お客様に「ACM で発行した証明書を利用できないか?」と聞かれても「エクスポートできないので利用できません」と回答していましたが、今回のアップデートで EC2 インスタンスで TLS を終端したい場合に、エクスポートした ACM パブリック証明書を利用できるようになりました。
お客様に選択肢を提示できるようになったので、個人的に嬉しいアップデートです。
本エントリでは、EC2 インスタンスの Nginx で ACM 証明書を利用して TLS を終端してみたいと思います。
やってみた
検証環境の構成は下図のとおりです。
ACM パブリック証明書をエクスポートする
まずは ACM でパブリック証明書を作成します。
エクスポートを有効にする
を選択してリクエストします。
私は Route53 でドメイン管理しているため、自動で DNS 認証がされ、証明書のステータスが発行済みとなります。
それではエクスポート
します。
パスフレーズを入力してPEM エンコーディングを生成
します。
このパスフレーズは Nginx の設定で必要となるため、忘れないようにします。
生成されると、証明書本文、証明書チェーン、証明書のプライベートキーがコピー / ダウンロードできるようになります。
以上で ACM パブリック証明書のエクスポートは完了です。
エクスポートした ACM パブリック証明書を Nginx にインストールする
EC2 インスタンスの OS は好きなもので良いですが、本エントリでは Amazon Linux 2023 を利用しています。
まずは Nginx をインストールします。
$ dnf -y install nginx
つぎに証明書のプライベートキー、パスフレーズ、証明書を各ディレクトリに配置していきます。
# 証明書のプライベートキーファイルを作成する
## マネジメントコンソールからプライベートキーの本文をコピペする
$ cd /etc/pki/tls/private
$ vim iiwakii.net.key
$ chmod 600 iiwakii.net.key
# 証明書のパスフレーズファイルを作成する
## エクスポートするときに設定したパスフレーズを記載する
$ vim iiwakii.net.key.passphrase
$ chmod 600 iiwakii.net.key.passphrase
# 証明書ファイルを作成する
## マネジメントコンソールから証明書本文をコピペする
$ cd /etc/pki/tls/certs
$ vim iiwakii.net.crt
$ chmod 600 iiwakii.net.crt
つぎに Nginx の conf ファイルを編集します。
$ cd /etc/nginx/
# デフォルトの nginx.conf との diff 結果
$ diff nginx.conf nginx.conf.org
38,43c38,44
< listen 443 ssl;
< server_name iiwakii.net;
< root /usr/share/nginx/html;
< ssl_certificate /etc/pki/tls/certs/iiwakii.net.crt;
< ssl_certificate_key /etc/pki/tls/private/iiwakii.net.key;
< ssl_password_file /etc/pki/tls/private/iiwakii.net.key.passphrase;
---
> listen 80;
> listen [::]:80;
> server_name _;
> root /usr/share/nginx/html;
>
> # Load configuration files for the default server block.
> include /etc/nginx/default.d/*.conf;
Nginx を再起動しておきます。
$ systemctl restart nginx
HTTPS で接続してみる
インターネットから直接 EC2 インスタンスにアクセスする構成なので、セキュリティグループで HTTPS のアクセスを許可しておきます。
また、ドメインでアクセスできるように Route53 で A レコードを追加しておきます。
以上で HTTPS で指定したドメインでアクセスできるようになります。
$ curl https://iiwakii.net
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
証明書情報も確認しておきます。
$ curl -sv https://iiwakii.net
~省略~
* SSL connection using TLSv1.3 / AEAD-CHACHA20-POLY1305-SHA256 / [blank] / UNDEF
* ALPN: server accepted http/1.1
* Server certificate:
* subject: CN=iiwakii.net
* start date: Jun 30 00:00:00 2025 GMT
* expire date: Jul 29 23:59:59 2026 GMT
* subjectAltName: host "iiwakii.net" matched cert's "iiwakii.net"
* issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M02
* SSL certificate verify ok.
~省略~
Chrome の証明書ビューアで見るとこんな感じ。
おわりに
以上、「エクスポートした ACM 証明書を利用して、EC2 インスタンス上の Nginx で TLS を終端してみた」でした。
EC2 インスタンス上でパブリック証明書を利用したい場合に取れる対応の選択肢が増えました。
もう ACM ではパブリック証明書をエクスポートできませんと言わなくてよくなったのは嬉しいです。
ただし、パブリック証明書のエクスポートは利用料金が掛かる点には注意してください。
- FQDN ごとに $15
- ワイルドカード の場合 $149
また、ACM と統合された AWS サービスで利用していないため、証明書のステータスで使用中ですか ?
がいいえ
のままになります。
いいえ
だから使ってないと判断し削除してしまい、 Web サイトにアクセスできなくなるケースが有り得そうなので注意が必要そうです。
本エントリが、どなたかのお役に立てれば幸いです。