はじめに
証明書は自分で触れる機会が少ないため、勉強がてらAWS ALBのサーバ/クライアント認証について検証してみました。本記事は、検証で整理できた処理および実装フローを記載してます。
処理フロー
下記のSSLハンドシェイクの流れで、サーバおよびクライアントの真正性を証明します。
その他、暗号化による盗聴の防止や、電子署名による改ざん防止にも有効です。
- クライアントからサーバへSSL/TLS通信をリクエスト。
- サーバからクライアントへサーバ証明書を送付。
- クライアントはルート証明書を用いてサーバ証明書を確認 (サーバ認証)。
- クライアントからサーバへクライアント証明書を送付。
- サーバはルート証明書を用いてクライアント証明書を確認 (クライアント認証)。
- クライアントとサーバ間で共通鍵の鍵交換を実施。
- クライアントとサーバ間でSSL/TLS通信を実施。
実装フロー
下記の構成をベースに、ALBのサーバ認証/クライアント認証を実装するフローを説明します。
処理フローで言うところのサーバはALB、クライアントはUserが該当します。
事前準備
サーバ認証/クライアント認証の成否を確認するためのWebサーバを構築します。
- VPCを作成
- VPC×1、Private Subnet×2、Public Subnet×2、Route Table×2を作成。
- Route Tableの1つはPrivate Subnet×2、もう1つはPublic Subnet×2へ関連付け。
- EC2 Instanceを作成
- 下記のユーザデータが設定されたEC2 Instance×2、Security Group×1を作成。
(NATGWを作成する等し、一時的にインターネットに接続する必要あり。)
- 下記のユーザデータが設定されたEC2 Instance×2、Security Group×1を作成。
#!/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"に変更して下さい。
サーバ認証
サーバ認証で必要となるドメインや証明書を取得・作成のうえデプロイします。
- Route53でホストゾーンを作成
# 秘密鍵を作成
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
- 証明書をリクエストする場合
- ALBを作成
- IGWを作成
- IGWを作成し、作成済みVPCにアタッチ。
- Public Subnetへ関連付けたRoute Tableで0.0.0.0/0のターゲットとしてIGWを登録。
- Private Subnetへ関連付けたRoute Tableで0.0.0.0/0のターゲットとしてALBを登録。
- 証明書をインポートした場合
- ブラウザで「https://<取得済みドメイン>/」へアクセス。
- 保護されていない通信で「web1」もしくは「web2」を表示。
- 今回のような自己証明書の場合、下記のような画面が表示されることがありますが、詳細情報を表示のうえ、取得済みドメインにアクセスするを選択。
クライアント認証
クライアント認証で必要となる証明書を作成のうえデプロイします。
- S3 Bucketを作成
# ルート秘密鍵を作成
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
- ALBを修正
- クライアント認証を確認
- Linux上で下記のコマンドを実行し、「web1」もしくは「web2」を表示。
curl --key client.key --cert client.pem https://<取得済みドメイン>.com/
web1
まとめ
AWS ALBのサーバ認証/クライアント認証の処理および実装フローを紹介しました。
おわりに
AWS ALBのサーバ認証/クライアント認証を行われる方にとって参考になりますと幸いです。