相互TLSとトラストストア(Trust Store)
本記事では、mTLS(相互認証)の鍵となる概念 「トラストストア(Trust Store)」 の仕組みについての説明と、AWSのALB(Application Load Balancer)を用いた動作検証を行います。
1. トラストストアとは何か
トラストストアは、一言で言えば 「通信を許可する相手を判定するための、信頼できる認証局(CA)の証明書リスト」 です。
- 通常のTLS(サーバー認証) : クライアント(ブラウザ等)が、サーバーから提示された証明書を、自身の持つトラストストア(OSやブラウザに標準搭載されたパブリックCAリスト)で検証します。
- 相互TLS(mTLS) : サーバー側も、クライアントから提示された証明書を、サーバー側が管理するトラストストアで検証します。
2. 「証明書バンドル(PEMファイル)」の作り方
トラストストアの実体は、多くの場合「PEM形式のテキストファイル」です。複数のCAを信頼する場合、1つのファイルに複数の証明書を連結(バンドル)して使用します。
-
形式: Base64エンコードされたASCIIテキスト(
-----BEGIN CERTIFICATE-----で始まるもの) -
連結ルール: 1つのファイル内に、以下の順序でテキストを貼り付けます。
- 中間CA証明書(複数ある場合は、下位のCAから順に)
- ルートCA証明書
- 注意点: 自身の「クライアント証明書」そのものは含めません。あくまで「署名者(親)」のリストを作成します。
3. mTLSの主なユースケース
- IoTデバイス接続 (AWS IoT Core): 工場のセンサーや車載デバイスなどの機密性の高い認証。
- クライアントVPN (AWS Client VPN): 証明書ベースの強固なデバイス認証。
- サービスメッシュ (App Mesh / Istio): マイクロサービス間通信における認証と暗号化。
- B2B API連携: 特定のパートナー企業間のみで通信を許可するAPI。
4. 【実機検証】ALBでmTLSの挙動を確認する
ALBのmTLS機能を利用して、証明書を持たないリクエストがブロックされることを確認します。
手順1:プライベートCAとクライアント証明書の作成(OpenSSL)
検証用に、自分自身の認証局(CA)を立てて証明書を発行します。以下のステップで計6つのファイルが生成されます。
① 認証局(CA)の作成
# 1. 認証局の秘密鍵を作成
openssl genrsa -out rootCA.key 2048
# 2. 認証局の公開証明書(ルート証明書)を作成
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem -subj "/CN=MyPrivateCA"
② クライアント証明書の作成
# 3. クライアントの秘密鍵を作成
openssl genrsa -out client.key 2048
# 4. 署名要求(CSR)の作成
openssl req -new -key client.key -out client.csr -subj "/CN=MyClient"
# 5. CAの鍵を使って署名し、クライアント証明書を発行
openssl x509 -req -in client.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out client.crt -days 500
生成される全6ファイルの役割まとめ
一連のコマンドで以下のファイルが手元に揃います。
| ファイル名 | 役割 | 扱い・用途 |
|---|---|---|
| rootCA.key | CAの秘密鍵 | 最重要機密。署名にのみ使用し、他者には渡さない。 |
| rootCA.pem | CAの公開証明書 | AWSのトラストストアにアップロードする。 |
| rootCA.srl | シリアル番号管理ファイル |
-CAcreateserialにより自動生成。CA内部の管理用。 |
| client.key | クライアントの秘密鍵 | 接続検証(curl)で使用。 クライアント側で秘匿。 |
| client.csr | 証明書署名要求 | 証明書を発行するための一次ファイル。発行後は不要。 |
| client.crt | クライアントの公開証明書 | 接続検証(curl)で使用。 ALBへ提示する。 |
手順2:AWSへの設定
-
rootCA.pemをS3バケットにアップロードします。 - EC2コンソールの「ロードバランシング」>「トラストストア」メニューから、S3上のファイルを指定してトラストストアを作成します。
- ALBのHTTPSリスナー設定で 「相互TLS(mTLS)」 を有効にし、作成したトラストストアを紐付けます。
手順3:接続検証
① 証明書なしでアクセス(拒否されることを確認)
curl -ik https://your-alb-domain.com
-
結果:
curl: (56) Recv failure: Connection reset by peer等のリセットが発生。アプリケーション(バックエンド)に到達する前にALBが遮断します。
② 正しい証明書でアクセス(通過することを確認)
curl -ik https://your-alb-domain.com --key client.key --cert client.crt
-
結果:
HTTP/2 200が返り、設定した固定レスポンスやターゲットグループからの応答が確認できます。
5. おわり
今回はAWS SAPの更新時に気になった、相互TLSとトラストストアの仕組みについてまとめてみました。
今回は設定が比較的簡単そうなALBで試しましたが、APIGatewayでもALB同様S3からバンドルをインポートして設定するようです。

この記事がどなたかの参考になれば幸いです。
6.参考