はじめに
Webサイトのセキュリティを高めるためにSSL/TLSサーバ証明書は欠かせない存在です。サーバ証明書は、インターネット上の通信を暗号化し、ユーザーが安心してサービスを利用できるようにする重要な要素です。本ブログでは、サーバ証明書の取得から管理までの一般的な流れに触れた上で、Certbotを使用した証明書発行とAWS Certificate Manager(ACM)を使った場合の違いについて実装を交えて解説します。
一般的なサーバ証明書の発行・管理の流れ
CSR(Certificate Signing Request)の作成
CSR(Certificate Signing Request)は、SSL/TLS証明書を取得するために必要な情報を含むデータファイルです。サーバ管理者がOpenSSLなどのツールを使い、CSRを作成します。CSRには公開鍵、ドメイン情報、組織情報などが含まれています。この情報を元に、証明書発行機関(CA)がサーバの身元を確認し、適切な証明書を発行します。
証明書の発行依頼
CSRをCA(証明書発行機関)に提出し、証明書の発行を依頼します。CAはCSRを受け取った後、ドメインの所有権確認を行い、証明書を発行します。
証明書のインストール
CAから発行された証明書を受け取り、サーバ(Apache、Nginxなど)にインストールします。
証明書の更新管理
証明書の有効期限が近づくと、再度CSRを作成してCAに証明書の更新を依頼します。更新が完了したら、新しい証明書をサーバにインストールします。有効期限切れを防ぐための管理が必要です。
ACM(AWS Certificate Manager)の流れ
CSRの作成
ACMではユーザーがCSRを手動で作成する必要はありません。AWSが自動的にCSRを生成します。
証明書の発行依頼
AWSコンソールから証明書をリクエストします。ACMが証明書発行機関に対して発行依頼を行い、ドメイン認証をサポートします。ユーザーはメール認証またはDNS認証を選んで所有権の確認を行います。
- メール認証:AWSから送信されるメールは、WHOIS登録情報または特定の管理用メールアドレスに送信されます。メール内のリンクをクリックして認証を完了する必要があります。ACMでのメール認証は、手動の手順が必要であるため、非推奨とされています。
- DNS認証:AWSが指定するCNAMEレコードをドメインのDNS設定に追加します。この認証方法は一度設定すれば自動更新にも対応できるため、手動でメールを確認する手間が省けます。DNSレコードの設定が正しく行われれば、ACMは所有権を自動的に確認し、証明書を発行します。
証明書のインストール
発行された証明書はAWSのリソース(ALB、CloudFront、API Gatewayなど)に直接アタッチできます。
証明書の更新管理
ACMは証明書の更新を自動で行うため、有効期限切れを防ぐ管理の手間は不要です。AWSが証明書の更新手続きをバックグラウンドで行います。ただし、ACMにインポートした証明書は自動更新がサポートされていないため、手動で更新する必要があります。
ACMで証明書を発行する際の制約
- AWSリソース限定:ACMで発行した証明書は、AWS内のリソース(ALB、CloudFront、API Gatewayなど)でのみ使用可能です。外部のWebサーバ(オンプレミスや他のクラウドプロバイダー上のサーバ、またはEC2インスタンス等)にはインストールできません。
- ワイルドカード証明書の制限:ACMではワイルドカード証明書が発行可能ですが、サブドメイン階層が1階層に限られます(例:login.example.comおよびtest.example.comを保護できますが、test.login.example.comを保護することはできません)。
- 証明書の転用不可:ACMで発行された証明書は、直接ダウンロードして他の環境で利用することができません。そのため、複数のクラウド間やオンプレミス環境での一貫性を求める場合には、一般的なCA(DigiCertやLet’s Encrypt)を利用する必要があります。
一般的なサーバ証明書とACMの比較
項目 | 一般的なサーバ証明書(*1) | ACM(AWS Certificate Manager) |
---|---|---|
CSRの作成 | 手動でCSRを作成する必要あり | ACMが自動でCSRを生成 |
証明書の発行依頼 | CAに手動で依頼し、ドメイン認証を行う必要がある | AWS マネジメントコンソール、AWS CLIを通じて発行依頼可能 |
証明書のインストール | サーバに手動で証明書をインストールする必要がある | AWS マネジメントコンソール、AWS CLI経由でAWSリソースへのアタッチ可能 |
証明書の更新管理 | 手動での更新が必要 | ACMが自動で更新手続きを行う。ただし、ACMにインポートした証明書は自動更新がサポートされていないため、手動で更新する必要がある。 |
利用可能な環境 | 基本的にどのような環境でも利用可能 | AWSの特定サービス(ALB、CloudFront、API Gatewayなど)に限定 |
証明書の費用 | 発行手数料がかかる場合がある | 無料 |
(*1)Certbotなどのツールを使用することで、CSRの作成や証明書の更新管理の手順を自動化することが可能です。Certbotは、無料のSSL証明書を発行するサービス「Let’s Encrypt」が提供する公式クライアントです。Certbotを使用すると、サーバ証明書の発行や自動更新が簡単に行えます。CertbotはApacheやNginxに対してSSL証明書をインストールするだけでなく、証明書の更新も自動化するため、頻繁に証明書の期限を気にする必要がありません。
実際にやってみた – 検証環境での実践手順
一般的なサーバ証明書の発行・管理手順(Apache + Let’s Encrypt)
前提条件
- Webサーバ:ApacheがインストールされたAmazon Linux 2023サーバ
- ドメイン名:取得したいSSL証明書のドメイン名(crt-test.net)
1. ポート80の開放
Apacheが使用するポート80を開放するために、httpd.conf
ファイル(*2)を編集します。
(*2)Apache HTTP サーバーの主要な設定ファイルです。
# Apacheの設定ファイルを編集してポート80を開放する
sudo vi /etc/httpd/conf/httpd.conf
設定ファイル内で以下の行を追加します。コメントアウトされている場合は解除します。
<VirtualHost *:80>
ServerName www.crt-test.net
DocumentRoot /var/www/html
</VirtualHost>
ファイルを保存して終了後、Apacheを再起動します。
# Apacheを再起動して設定を反映する
sudo systemctl restart httpd
2. Certbotのインストール
Certbotをインストールします。
# CertbotおよびApache用プラグインをインストールする
sudo dnf install -y certbot python3-certbot-apache
3. Certbotを使用して証明書を発行
以下のコマンドを実行し、Apache用のSSL証明書を取得します。
# Apacheを使用して指定したドメインのSSL証明書を発行するためのコマンド
sudo certbot --apache -d www.crt-test.net
-d www.crt-test.net:取得するドメイン名を指定します。複数のドメインを指定する場合は、カンマで区切って記載します(例:-d example.com -d www.example.com)。
取得プロセス中に、CertbotがApacheの設定を自動的に行います。ドメイン所有権が確認されると、Let’s Encryptから証明書が発行されます。証明書が正常に発行されると、「Successfully received certificate.」というメッセージが表示されます。
4. 証明書のインストールとApacheの設定確認
https://crt-test.netにアクセスし、SSL証明書が適用されていることを確認します。
# 該当ドメインにhttps経由でアクセスする
curl -I https://www.crt-test.net
HTTPステータスコードが 200 OK
であることを確認します。
5. 証明書の更新管理設定
Let’s Encryptの証明書は90日間有効です。Certbotは自動更新の設定が可能で、証明書の有効期限が近づいた際に自動的に更新を行います。
Certbotの自動更新設定が正しく機能しているか確認するために、以下のコマンドを実行します。
# 証明書の自動更新が正しく設定されているかをテストするためのコマンド
sudo certbot renew --dry-run
このコマンドにより、Certbotが証明書の更新処理をシミュレートし、自動更新が正しく設定されていることを確認できます。シミュレーションが成功した場合、「Congratulations, all simulated renewals succeeded:
」というメッセージが表示されます。
ACM(AWS Certificate Manager)の利用手順
前提条件
- AWSリソース:証明書を使用するApplication Load Balancerを用意します。
- ドメインの事前取得:Route 53でドメインを事前に取得します。
1. 証明書リクエストの作成
AWSマネジメントコンソールにログインし、AWS Certificate Managerに移動します。
証明書のリクエストボタンをクリックします。
証明書の種類を選択します(今回はパブリック証明書を選択します)。
ドメイン名を入力し、検証方法の選択で、「DNS認証」を選択します。キーアルゴリズムはデフォルトとします。
リクエストをクリックします。
証明書が作成されたことを確認し、「Route 53でレコードを作成」をクリックします。
対象のドメインにチェックマークを入れて、「レコードを作成」をクリックします。
Routeのホストゾーンの画面からCNAMEレコードが追加されていることを確認します。
所有権確認が完了すると、ACMは証明書を発行します。
証明書のステータスが「発行済み」になったことから確認が可能です。
2. 証明書の発行とリソースへのアタッチ
発行された証明書は、Application Load Balancer(ALB)、CloudFront、API GatewayなどのAWSリソースに直接アタッチ可能です。証明書のアタッチ方法は、使用するAWSサービスの設定画面で証明書を選択するだけです。
今回はALBのリスナー設定からACMで発行したドメイン名を選択します。
ブラウザで該当のドメイン名を入力し、Webサーバにアクセスできたことを確認します。
4. 証明書の自動更新管理
ACMでは、証明書の更新が自動的に行われるため、証明書の有効期限切れを防ぐための手動管理は不要です。
ACMがバックグラウンドで証明書の更新手続きを行い、AWSリソースに適用済みの証明書を最新の状態に保ちます。
まとめ
サーバ証明書の発行・管理には手動で行う方法と、AWS Certificate Managerを利用する方法があります。ACMはAWS環境に特化しており、AWSリソースと密接に統合されているため、証明書の発行・管理が非常に簡単です。しかし、ACMはAWSのリソース専用であり、他の環境での利用には一般的なサーバ証明書の方が柔軟性が高い場合もあります。プロジェクトの環境や要件に応じて最適な管理方法を選択することが重要です。もしAWS環境を利用しているのであれば、ACMはコストや管理負荷の面で非常に魅力的な選択肢となるでしょう。
コメント