yamamototis1105’s tech blog

ネットワークを中心とした技術ブログです

AWS ALBのサーバ/クライアント認証の処理および実装フロー

はじめに

 証明書は自分で触れる機会が少ないため、勉強がてらAWS ALBのサーバ/クライアント認証について検証してみました。本記事は、検証で整理できた処理および実装フローを記載してます。

処理フロー

 下記のSSLハンドシェイクの流れで、サーバおよびクライアントの真正性を証明します。
その他、暗号化による盗聴の防止や、電子署名による改ざん防止にも有効です。

  1. クライアントからサーバへSSL/TLS通信をリクエスト。
  2. サーバからクライアントへサーバ証明書を送付。
  3. クライアントはルート証明書を用いてサーバ証明書を確認 (サーバ認証)。
  4. クライアントからサーバへクライアント証明書を送付。
  5. サーバはルート証明書を用いてクライアント証明書を確認 (クライアント認証)。
  6. クライアントとサーバ間で共通鍵の鍵交換を実施。
  7. クライアントとサーバ間でSSL/TLS通信を実施。

実装フロー

 下記の構成をベースに、ALBのサーバ認証/クライアント認証を実装するフローを説明します。
処理フローで言うところのサーバはALB、クライアントはUserが該当します。

事前準備

 サーバ認証/クライアント認証の成否を確認するためのWebサーバを構築します。

  1. VPCを作成
    • VPC×1、Private Subnet×2、Public Subnet×2、Route Table×2を作成。
    • Route Tableの1つはPrivate Subnet×2、もう1つはPublic Subnet×2へ関連付け。
  2. EC2 Instanceを作成
    • 下記のユーザデータが設定されたEC2 Instance×2、Security Group×1を作成。
      (NATGWを作成する等し、一時的にインターネットに接続する必要あり。)
#!/bin/bash
yum install httpd -y
systemctl start httpd.service
systemctl enable httpd.service
touch /var/www/html/index.html
echo "web1" | tee -a /var/www/html/index.html

 ※最後の一文は、2つ目のEC2 Instanceでは"web1"を"web2"に変更して下さい。

サーバ認証

 サーバ認証で必要となるドメインや証明書を取得・作成のうえデプロイします。

  1. Route53でホストゾーンを作成
Route53 画面
ドメイン管理サービス画面


  1. ACMサーバ証明書を作成
    • 証明書をインポートする場合
      • Linux上で下記のコマンドを実行し、秘密鍵/証明書、CSRファイルを作成。作成中に求められるCommon Nameは取得済みドメイン、それ以外は初期値でOK。
      • 証明書本文は、証明書の中身を転記。
      • 証明書のプライベートキーは、秘密鍵の中身を転記。
      • その他は、デフォルトのままでOK。
# 秘密鍵を作成
openssl genrsa -out private.key
# CSRファイルを作成
openssl req -new -key private.key -out server.csr
# 証明書を作成
openssl x509 -req -days 365 -in server.csr -signkey private.key -out server.crt
  • ブラウザがGoogle Chromeの場合、ERR_CERT_AUTHORITY_INVALIDメッセージで認証が失敗しますが、Subject Alternative Nameパラメータで解決します。
# 秘密鍵を作成
openssl genrsa -out private.key
# CSRファイルを作成
openssl req -new -key private.key -out server.csr
# EXTファイルを作成
echo "subjectAltName = DNS:<取得済みドメイン>" > san.txt
# 証明書を作成
openssl x509 -req -days 365 -in server.csr -signkey private.key -out server.crt -extfile san.txt
  • 証明書をリクエストする場合
    • 証明書タイプは、パブリック証明書を選択。
    • ドメイン名は、取得済みドメインを入力。
    • 検証方法は、DNS検証を選択。
    • その他は、デフォルトのままでOK。
    • サーバ証明書が作成できたら、ドメイン所有者を確認するためRoute53にCNAMEレコードを登録。
ACM 画面
Route53 画面


  1. ALBを作成
    • ターゲットグループを作成。
      • ターゲットタイプは、インスタンスを選択。
      • ターゲットグループ名は、任意の文字列を入力。
      • ターゲットのプロトコルはHTTPを選択し、ポートは80を入力。
      • VPCは、作成済みVPCを選択。
      • ターゲットは、作成済みEC2 Instance×2を選択。
      • その他は、デフォルトのままでOK。
    • ロードバランサ―名は、任意の文字列を入力。
    • スキームは、インターネット向けを選択。
    • VPCは、作成済みVPCを選択。
    • サブネットは、作成済みPublic Subnetを選択。
    • セキュリティグループは、作成済みSecurity Groupを選択。
    • リスナーのプロトコルHTTPSを選択し、ポートは443を入力。
    • デフォルトアクションは作成済みターゲットグループを選択。
    • デフォルトSSL/TLSサーバ証明書は、作成済みサーバ証明書を選択。
    • その他は、デフォルトのままでOK。
    • ALBが作成できたら、ALBのDNSをALIASレコードとして、Route53にを登録。
ALB 画面
Route53 画面


  1. IGWを作成
    • IGWを作成し、作成済みVPCにアタッチ。
    • Public Subnetへ関連付けたRoute Tableで0.0.0.0/0のターゲットとしてIGWを登録。
    • Private Subnetへ関連付けたRoute Tableで0.0.0.0/0のターゲットとしてALBを登録。
  1. サーバ認証を確認
    • 証明書をリクエストした場合
      • ブラウザで「https://<取得済みドメイン>/」へアクセス。
      • 保護された通信で「web1」もしくは「web2」を表示。
  • 今回のような自己証明書の場合、下記のような画面が表示されることがありますが、詳細情報を表示のうえ、取得済みドメインにアクセスするを選択。

クライアント認証

 クライアント認証で必要となる証明書を作成のうえデプロイします。

  1. S3 Bucketを作成
    • Linux上で下記のコマンドを実行し、ルート/クライアントの秘密鍵/証明書、CSRファイルを作成。作成中に求められるCommon Nameは取得済みドメイン、それ以外は初期値でOK。
    • バケット名は、任意の文字列を入力。
    • バケットのバージョニングは、有効を選択。
    • S3 Bucketが作成できたら、CAバンドル (複数のルート/中間証明書を含むファイルですが、今回はルート証明書のみ) をアップロード。
# ルート秘密鍵を作成
openssl genrsa -out root.key
# クライアント秘密鍵を作成
openssl genrsa -out client.key
# CSRファイルを作成
openssl req -new -key client.key -out client.csr
# ルート証明書を作成
openssl req -new -x509 -days 365 -key root.key -out root.pem
# クライアント証明書を作成
openssl x509 -req -days 365 -in client.csr -CA root.pem -CAkey root.key -set_serial 01 -out client.pem
  1. ALBを修正
    • トラストストアを作成。
      • トラストストアの名前は、任意の文字列を入力。
      • 認証局バンドルは、作成済みS3 Bucketにアップロード済みCAバンドルを選択。
      • その他は、デフォルトのままでOK。
    • 相互認証 (mTLS) は、チェックを付けたうえでトラストストアで検証を選択。
    • トラストストアは、作成済みトラストストアを選択。
    • その他は、デフォルトのままでOK。
  1. クライアント認証を確認
    • Linux上で下記のコマンドを実行し、「web1」もしくは「web2」を表示。
curl --key client.key --cert client.pem https://<取得済みドメイン>.com/
web1

まとめ

 AWS ALBのサーバ認証/クライアント認証の処理および実装フローを紹介しました。

おわりに

 AWS ALBのサーバ認証/クライアント認証を行われる方にとって参考になりますと幸いです。