AWS ACMのついて
概要
AWS ACMはHTTPS通信をするために、SSL / TLSサーバー証明書を管理する仕組み
登場人物
AWS ACM(AWS Certificate Manager)
証明書を管理するAWSのリソース
AWS HSM(秘密鍵保護モジュール)
秘密鍵と公開鍵のペアを内部で生成して管理するセキュリティモジュール
CSR作成時には、公開鍵のみを使用する
AWSマネコンなどで確認はできずに、作成した鍵を取り出すことはできない
認証局(CA)
証明書を発行する組織
AWSでの場合は、Amazon Trust Services
CSR(Certificate Signing Request)
認証局に証明書発行依頼をするときのリクエスト
以下の情報が含まれている
公開鍵
Common Name (CN): www.example.com
署名アルゴリズム(例:SHA256withRSA)
組織名・国コード
以下のようなファイルが作成される
code:text
-----BEGIN CERTIFICATE REQUEST-----
MIIC0DCCAbgCAQAwgYUxCzAJBgNVBAYTAkpQMQ8wDQYDVQQIDAZUb2t5bzEPMA0G
A1UEBwwGUm9wcG9uMRIwEAYDVQQKDAlFeGFtcGxlQ28xEjAQBgNVBAsMCUluZnJh
U2VjQ0ExFzAVBgNVBAMMDnd3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAKmqk5NLM6Q4MHDkoRgK1YvTbn8cgV06oPfLjQF2vlAB
gV+xJ5asBzZa50R9N6lAvL6wZnqlY7zYIBkCv/4Jo1wslZjRyHqdx9Tv5jWygx/F
q3AvC60lq3SvCwT1I8bbFeYJw6YeDFfX6vJ7VZxkR8VtDEIhYf7iD5Z72N59B3HT
YAwzJ+b6XMPJ5Oy5bKnfTFlK3DC9n8yb2Fh0pZfBvlddFwIDAQABoAAwDQYJKoZI
hvcNAQELBQADggEBAH7/Y5XJ6gG3vRvkLEKQhDN+HTo+eeiUl0AIrnpLE8on3CFO
hPBoNFFm6MZwQbD4nDs5f2TTv6J1Eiqo57J7z6G4PM0uR3/0CMJc3znbFfiOnbPk
1jRYR4C5nR1sOYi9gAJ7xMtq/6MNEsK42JDBP9J+uKpFSvN+5Dc9JK+xrA+kylgU
-----END CERTIFICATE REQUEST-----
証明書チェーン
実際にHTTPS通信で使用される証明書
以下のものが含まれる
ルート証明書
信頼の最上位にあたり証明書
発行者:認証局本体(Amazon Trust Serviceに含まれる)
利用者:ブラウザやOS
補足:AWSの場合は、ACMとATSのルート証明書と中間証明書は、統一で管理されているため。ACM側でも確認ができる。
中間証明書
ルート認証局とサーバー証明書の橋渡しの役割を果たす
発行者:ルート認証局(Amazon Trust Serviceに含まれる)
利用者:認証局自身
補足:AWSの場合は、ACMとATSのルート証明書と中間証明書は、統一で管理されているため。ACM側でも確認ができる
サーバ証明書(リーフ証明書)
特定のドメインが本物であるかを証明する。
発行者:中間認証局(Amazon Trust Serviceに含まれる)
利用者:Webサーバー・ALB・Cloud Front
階層構造が以下のようになる
ルート証明書から辿ることで、ブラウザがサーバー証明書は信頼できるという判断ができる
code:text
ルート証明書
└─ 発行者(Issuer): 自分自身
└─ 対象者(Subject): 自分自身
↓ 署名して発行
中間証明書
└─ 発行者(Issuer): Root CA
└─ 対象者(Subject): Amazon RSA 2048 M02
↓ 署名して発行
サーバー証明書
└─ 発行者(Issuer): Intermediate CA
└─ 対象者(Subject): www.example.com
実際に以下のようなファイルが作成される
code:text
-----BEGIN CERTIFICATE----- // サーバー証明書
MIIFxzCCA6+gAwIBAgIQB8h+q3+L0nDsh1uCt3l...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- // 中間証明書
MIIFjTCCBHagAwIBAgIQAjpR+FY...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- // ルートCA証明書
MIIFazCCA1OgAwIBAgISA1q8mz...
-----END CERTIFICATE-----
証明書作成フロー
code:mermaid
sequenceDiagram
participant User as ユーザー
participant ACM as AWS Certificate Manager
participant HSM as AWS HSM<br/>(秘密鍵保護モジュール)
participant CA as 認証局<br/>(Amazon Trust Services)
participant DNS as DNS<br/>(Route53)
participant ALB as ALB<br/>(ELB)
User->>ACM: 証明書をリクエスト(ドメイン指定)
ACM->>HSM: 秘密鍵・公開鍵ペアを生成
HSM-->>ACM: 公開鍵を返却(秘密鍵はHSMに保持)
ACM->>ACM: CSR(証明書署名要求・Certificate Signing Request)を作成
ACM->>CA: CSRを送信
User->>DNS: 認証局から返答がきたリクエストをCNAMEレコードに登録
CA->>DNS: ドメイン所有検証要求(DNS or Email or HTTP)<br>この場合はDNS
DNS-->>CA: 検証成功
CA-->>ACM: サーバー証明書(中間認証局の証明も含む)を発行(署名済み)
ACM->>ACM: 証明書チェーンを保存(サーバ+中間+ルート)
ACM-->>User: 証明書利用準備完了通知
User->>ALB: 証明書をアタッチ
ALB-->>ACM: 証明書を取得
ACM->>ALB: サーバ証明書+チェーン返却
ドメイン少輔検証プロセスでは以下のどれかを行うことになる
DNS検証(推奨):ユーザーがRoute53などのDNSの特定のCNAMEレコードを登録し、認証局がチェックを行う
Email:ドメイン管理者宛に承認メールを送信して、承認リンクを踏む
HTTP:Webサーバ上に特定のファイルを設置して、認証を行う
HTTPSリクエストフロー
code:mermaid
sequenceDiagram
participant Client as ブラウザ/クライアント
participant ALB as ALB/CloudFrontなど
participant ACM as AWS Certificate Manager
participant HSM as AWS HSM<br/>(秘密鍵保護モジュール)
Note over ALB,ACM: 【初期化フェーズ】<br/>ALBが起動または証明書更新時に一度だけ実行
ALB->>ACM: 証明書を取得(初回または更新時)
ACM-->>ALB: サーバ証明書+中間証明書を返却
ALB->>HSM: 秘密鍵ハンドルを初期化(鍵を参照可能に)
Note over Client,HSM: 【通信フェーズ】<br/>以降は証明書を再取得せず、HSMで署名のみ毎回実行
Client->>ALB: HTTPS接続要求(TLSハンドシェイク開始)
ALB->>HSM: 秘密鍵を使って署名処理(HSM内部で実行)
HSM-->>ALB: 署名完了(秘密鍵は露出せず)
ALB-->>Client: サーバ証明書+署名データを送信
Client->>Client: 証明書チェーン検証(信頼済みCAか確認)
Client-->>ALB: TLSセッション確立
ALB-->>Client: HTTPS暗号化通信開始