ACM 証明書のエクスポートできるようになったということで、あえて EC2 で稼働している Apache で HTTPS 設定してみる

記事タイトルとURLをコピーする

こんにちは、末廣です。

アップデート紹介と IT 初心者に戻った気持ちブログです。

aws.amazon.com

これまで ALB や CloudFront など、特定のサービスでしか利用できなかった ACM の無料パブリック証明書ですが、エクスポートして EC2 などのワークロード上で使えるようになりました。

AWS 公式ブログを参考に、せっかくなので EC2 で HTTPS の Web サーバ(Apache)を公開してみます。 今までは ALB を TLS の終端にして楽に設定してきたので、あえてレガシーな構成を作っていきます。

aws.amazon.com

証明書のエクスポートと準備

ACMから証明書をエクスポート

まずは ACM のコンソールから、証明書をエクスポートします。 既存の証明書については残念ながらエクスポートすることはできません。新しくリクエストしましょう。

既存の証明書

「エクスポートを有効化にする」を選んでリクエストします。

エクスポートを許可

PEM エンコーディングを生成する前に秘密鍵を暗号化するためのパスワードを設定するよう求められます。 公式ブログでも言及されていますが、このパスワードは後ほど、暗号化を解除するために必要になります。

PEM エンコーディングを生成

証明書、証明書チェーン、プライベートキーをダウンロードします。

証明書のダウンロード

当然ですが、マネジメントコンソールを日本語表示にしていると、ファイルの自動命名が日本語になってしまいます。Chrome ブラウザの設定で「ダウンロード前に各ファイルの保存場所を確認する」を有効にしている場合は保存タイミングでファイル名を英語に変更するか、マネジメントコンソールの表示言語を英語にしておいたほうが良いかもしれません。

日本語版ダウンロードファイル

英語版ダウンロードファイル

秘密鍵の暗号化を解除

エクスポートした秘密鍵はパスワードで保護されており、Web サーバーは起動時にパスワードを自動入力できません。サーバーに配置する前に、この暗号化を解除した秘密鍵を作成する必要があるため、毎度お馴染みのopensslコマンドで対応します。

$ openssl rsa -in private_key.txt -out private_key.pem
# エクスポート時に設定したパスワードの入力
Enter pass phrase for private_key.txt:
writing RSA key

EC2 での作業

EC2 にファイル配置

証明書、中間証明書、パスワードを解除した秘密鍵を EC2インスタンスに配置します。

まず、所定のディレクトリを作成、ファイルを移動します。 証明書をダウンロードした際はそれぞれ txt 形式だったはずなので pem 形式に変換するか、pem ファイルを作成し、中身をコピペします。

# ディレクトリ作成
$ sudo mkdir -p /etc/ssl/private
$ sudo mkdir -p /etc/ssl/certs

# ファイルを移動
$ sudo mv certificate.pem /etc/ssl/certs/
$ sudo mv certificate_chain.pem /etc/ssl/certs/
$ sudo mv private_key.pem /etc/ssl/private/

秘密鍵は rootユーザーのみが読み取れるように権限の変更をします

$ sudo chmod 600 /etc/ssl/private/private_key.pem
$ sudo chown root:root /etc/ssl/private/private_key.pem

Apache の設定

Apache の SSLモジュール(mod_ssl)をインストール
$ sudo dnf install -y mod_ssl
ApacheのSSL設定(/etc/httpd/conf.d/ssl.conf)を編集

Apache にポート 443で待ち受け、使用する証明書の設定を記載します

# /etc/httpd/conf.d/ssl.conf

Listen 443 https

# ポート80(HTTP)へのアクセスをHTTPSにリダイレクトする設定
<VirtualHost *:80>
    ServerName export.mydomain.com
    Redirect permanent / https://export.mydomain.com/
</VirtualHost>

# ポート443(HTTPS)の設定
<VirtualHost *:443>
    ServerName export.mydomain.com
    DocumentRoot "/var/www/html"

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/certificate.pem
    SSLCertificateKeyFile /etc/ssl/private/private_key.pem
    SSLCertificateChainFile /etc/ssl/certs/certificate_chain.pem
</VirtualHost>

Apacheの起動と動作確認

Apacheを起動し、正しく動作しているかを確認します

構文チェック
$ sudo apachectl configtest
サービス再起動
$ sudo systemctl restart httpd
ポート確認
$ sudo netstat -tulpn | grep ':443'
接続テスト

テストするドメイン名を名前解決できるようにし、テストします

$ curl https://export.mydomain.com
証明書確認
$ curl -v https://export.mydomain.com
* Host export.mydomain.com:443 was resolved.
* IPv6: (none)
* IPv4: x.x.x.x
* Trying x.x.x.x:443...
* Connected to export.mydomain.com ([x.x.x.x) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / RSASSA-PSS
* ALPN: server accepted http/1.1
* Server certificate:
* subject: CN=export.mydomain.com
* start date: Jun 27 00:00:00 2025 GMT
* expire date: Jul 26 23:59:59 2026 GMT
* subjectAltName: host "export.mydomain.com" matched cert's "export.mydomain.com"
* issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M03
* SSL certificate verify ok.
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* using HTTP/1.x
> GET / HTTP/1.1
> Host: export.mydomain.com
> User-Agent: curl/8.5.0
> Accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
< HTTP/1.1 403 Forbidden
< Date: Thu, 10 Jul 2025 21:06:28 GMT
< Server: Apache/2.4.62 (Amazon Linux) OpenSSL/3.2.2
< Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
< ETag: "2d-432a5e4a73a80"
< Accept-Ranges: bytes
< Content-Length: 45
< Content-Type: text/html; charset=UTF-8
<
<html><body><h1>It works!</h1></body></html>
* Connection #0 to host export.mydomain.com left intact

issuer 箇所から ACM で取得された証明書であることが無事確認できました。

* issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M03

まとめ

今回は、新しくエクスポート可能になった ACM のパブリック証明書を、EC2 上の Apache に設定しました。

有効期間は 395 日間で、FQDN ごとに 15 ドル料金が発生するなど、あえてこの設定を有効化して証明書を作成する必要はない(むしろしない方が良い)ですが、オンプレミスや直接 TLS 通信を終端させるために証明書を使う場合、CloudWatch で更新期限を通知できるなど AWS で更新、管理、通知できる場合には使えそうですね。

末廣 満希(執筆記事の一覧)

2022年新卒入社です。ここに何かかっこいい一言を書くことができるエンジニアになれるように頑張ります。