はじめに
目的
本ドキュメントは、AWS環境でのSSL証明書取得と設定方法を分かりやすく示すことを目的としています。ACMを使った証明書発行、EC2上でのLet’s Encrypt導入、ALBでのクライアント証明書認証までを扱います。実務での導入や検証に役立つことを想定しています。
対象読者
ウェブサービス運用担当者、システム管理者、クラウド初心者でも読みやすい内容にしています。例として、社内向けサイトをHTTPS化したい方やテスト環境で学びたい方を想定しています。
本書の構成
第2章でACMによる証明書発行手順を説明します。第3章でEC2上に無料証明書(Let’s Encrypt)を導入する具体手順を示します。第4章ではALBでのクライアント証明書認証方法を説明します。
前提条件
AWSアカウントと基本的なコンソール操作の知識があることを前提とします。各手順では可能な限り具体例を示します。
AWSでSSL証明書を発行する方法
概要
AWS Certificate Manager(ACM)を使い、ロードバランサーで使うSSL証明書を発行します。ここではドメイン入力、ワイルドカードの例、検証(DNSによる確認)、発行後のALBへの適用とブラウザ確認までを説明します。
前提条件
- AWSアカウント
- ドメインの管理権限(例: example.com のRoute53ホストゾーン)
手順
- AWSマネジメントコンソールでACMを開き、「証明書のリクエスト」をクリックします。
- ドメイン名を入力します。例: example.com、サブドメイン全体を含める場合はワイルドカード *.example.com を指定します。
- 検証方法は「DNS検証」を推奨します。Route53を使うとボタン一つでCNAMEレコードを作成できます。手動で作成する場合は表示されたCNAMEをホストゾーンに追加してください。
- DNS反映後、ACMが自動で証明書を発行します(短時間で完了することが多いです)。
- 発行された証明書をALBのリスナー(HTTPS)に割り当てます。ALBのリスナー設定で証明書を選び、ポート443で受け付けるようにします。
複数ドメインやワイルドカード
- 複数ドメイン(SAN)を指定できます。例: example.com と www.example.com を同時に登録可能です。ワイルドカードはサブドメイン全体を一度に保護します。
検証と確認
ブラウザで https://your-domain にアクセスし、鍵アイコンが表示されれば設定完了です。ACM発行の公開証明書はAWSが自動で更新するため、手動更新は不要です。
AWS EC2でのLet’s Encrypt無料SSL証明書設定方法
前提
- Route53でドメインがEC2のパブリックIP(またはALB/ELB)を指していること
- セキュリティグループで80番と443番が許可されていること
- EC2にrootまたはsudo権限でログインできること
1. Apacheとmod_sslのインストール
- Amazon Linux 2:
sudo yum update -y
sudo yum install -y httpd mod_ssl
sudo systemctl enable --now httpd
- Ubuntu:
sudo apt update
sudo apt install -y apache2
sudo systemctl enable --now apache2
2. certbotの導入
- Ubuntu(簡単):
sudo apt install -y certbot python3-certbot-apache
- Amazon Linuxや新版ではsnapを使う方法が確実です:
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
3. 証明書の発行(Apacheプラグイン)
例:
sudo certbot --apache -d example.com -d www.example.com --email you@example.com --agree-tos --non-interactive --redirect
このコマンドはApache設定を自動で更新し、HTTP→HTTPSのリダイレクトを有効にします。環境によりwebroot方式(certonly)を使うこともあります。
4. Apache設定の確認
- 証明書パスは通常以下です:
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem - Apacheのssl用VirtualHost(/etc/httpd/conf.d/ssl.conf もしくは /etc/apache2/sites-available/*-le-ssl.conf)で上記パスが設定されているか確認し、必要なら修正してください。
5. サービス再起動と動作確認
sudo systemctl restart httpd # or apache2
ブラウザで https://example.com にアクセスし、証明書情報を確認します。コマンドでも確認できます:
curl -I https://example.com
6. 自動更新の設定(90日対応)
- cron例(毎日3時に更新を試み、成功したらApache再読み込み):
sudo crontab -e
# 下記行を追加
0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload httpd"
- snapでインストールした場合はsystemdタイマーが自動で有効なことが多いです。
sudo systemctl status snap.certbot.renew.serviceで確認してください。
必要があれば、実際のドメイン名やOSに合わせた具体的なコマンドを提示します。
AWS ALBでのクライアント証明書認証の設定方法
前提条件
- ALB(Application Load Balancer)を作成済みでHTTPSリスナーがあること
- クライアント証明書(CA署名の証明書)を用意していること。例:社内CAで発行、またはOpenSSLで作成した自己署名CA
手順概要
- クライアント証明書の信頼チェーン(CA証明書)を用意
- AWS Certificate Manager (ACM) にCA証明書をインポート
- ALBのHTTPSリスナーで、クライアント認証を有効化してCAを指定
- 動作確認を行う
証明書の準備(例)
- 社内CAを使う場合は、CAの公開鍵(PEM)を用意します。
- OpenSSLで自己署名CAを作る場合:
- ca.crt を作成し、クライアント証明書はCAで署名します。
ACMへインポート
- ACMで「証明書のインポート」を選び、CA証明書をアップロードします。
- 名称は分かりやすく。「My-Client-CA」など
ALBでの設定
- EC2コンソール > ロードバランサー > 対象のALBを選択
- リスナー > HTTPSリスナーの「編集」 > 認証設定で「クライアント認証を要求」または「任意」を選択
- 先ほどインポートしたCAを指定
- 保存して適用
動作確認
- クライアント証明書を用意し、curlで接続例:
curl –cert client.crt –key client.key https://your-alb-endpoint - 正常ならHTTP 200等を受け取れます。証明書が無い/不正なら拒否されます。
注意点
- ALBはクライアント証明書を検証しますが、バックエンドに渡すかは設定次第です。必要ならヘッダで証明書情報を渡す仕組みを検討してください。
- CAを更新したらALBの設定も更新してください。












