クライアントのみがサーバーの ID を検証する一方向認証は、金融取引、医療、銀行、オンライン決済のシナリオにおけるセキュリティ要件を満たすことができません。サーバーは接続するすべてのクライアントを信頼するため、中間者攻撃や不正アクセスのリスクが発生します。Application Load Balancer (ALB) は、HTTPS リスナーでの相互認証を有効にします。相互認証では、クライアントとサーバーの両方が、データ送信のための安全な接続を確立する前に、互いの ID を検証する必要があります。
相互認証の概要
相互認証が必要な理由
ほとんどのインターネット Web アプリケーションは、さまざまなクライアントからのアクセスを歓迎します。これらのアプリケーションでは、一方向の HTTPS 認証のみが必要です。クライアントは、アプリケーションと対話する前にサーバー ID を検証し、有効なサーバーに接続していることを確認します。
ただし、より高いレベルのセキュリティが必要なシナリオでは、サーバー ID の検証だけでなく、クライアント認証も必要です。この場合、相互認証が役立ちます。これにより、承認されたクライアントのみがサーバーにアクセスできるようになり、中間者攻撃や不正アクセスなどのセキュリティリスクが軽減されます。
利用シナリオ
金融取引、ヘルスケア、銀行、オンライン決済など、高いセキュリティ要件を持つビジネスでは、クライアント側がサーバーの ID を検証する必要があるだけでなく、サーバーもクライアントを認証する必要があります。
クライアント認証が必要ない場合、相互認証は不要です。
制限事項
Standard Edition および WAF-Enhanced Edition の ALB インスタンスのみが相互認証をサポートします。Basic Edition の ALB インスタンスはこの機能をサポートしていません。
HTTPS リスナーのみが相互認証をサポートします。QUIC リスナーと HTTP リスナーはこの機能をサポートしていません。
シナリオ例
ある企業が、顧客向けのオンライン取引プラットフォームをデプロイしました。当初、このプラットフォームではデータ送信に一方向の HTTPS 認証のみを使用していましたが、一部の不正なデバイスがシステムにアクセスしようとしていることが判明し、データ漏洩や取引改ざんのリスクが生じました。さらに、ビジネスの成長に伴い、プラットフォームはトラフィックの急増時にパフォーマンスの課題に直面するようになりました。
これらの問題を解決するため、同社は Alibaba Cloud ALB をデプロイし、ALB サービスで相互認証を有効にすることを決定しました。
ALB の負荷分散機能により、クライアントリクエストをバックエンドサーバーに効率的に分散させ、高い同時実行性シナリオでも安定したパフォーマンスと高速な応答時間を確保できます。
ALB で相互認証を有効にすることで、プラットフォームにアクセスするすべてのクライアントは、プラットフォームとの接続を確立するために有効なクライアント証明書を提供する必要があり、不正なデバイスがシステムにアクセスするのを効果的にブロックし、データ漏洩や取引改ざんのリスクを大幅に削減します。
前提条件
Certificate Management Service にサーバー証明書を 購入 するか、アップロード していること。
この例では、証明書が購入されます。
説明SSL 証明書を購入するには、有効なカスタムドメイン名が必要です。
Certificate Management Service コンソールで中間 CA 証明書が 購入 されており、少なくとも 1 つのプライベート中間 CA 証明書が利用可能であること。または、自己署名ルート CA 証明書または中間 CA 証明書が Certificate Management Service に アップロード されていること。
VPC (VPC) (このガイドでは VPC1 という名前) を作成し、VPC1 に 2 つの Elastic Compute Service (ECS) インスタンス (このガイドではそれぞれ ECS01 と ECS02 という名前) を作成し、両方の ECS インスタンスにアプリケーションをデプロイしていること。
このガイドでは、ECS インスタンスで Alibaba Cloud Linux 3 オペレーティングシステムが使用され、NGINX を使用して HTTPS サービスが設定されます。
Standard または WAF-enabled エディションの ALB インスタンスを作成 していること。
サーバーグループを作成 し、ECS01 と ECS02 をバックエンドサーバーとしてサーバーグループに追加していること。
ALB が HTTPS プロトコルを使用してバックエンドサーバーと通信するようにしたい場合は、サーバーグループの作成時にバックエンドプロトコルとして HTTPS を選択し、バックエンドサーバーに HTTPS サービスがデプロイされていることを確認してください。
手順
ステップ 1: クライアント証明書をデプロイする
クライアント (ユーザー) 側では、クライアント証明書を準備してエクスポートする必要があります。
このガイドでは、CA 証明書を取得する 2 つの方法を紹介します。Certificate Management Service を通じて CA 証明書を 購入 してクライアント証明書を申請するか、自己署名 CA 証明書を Certificate Management Service に アップロード することができます。
1. クライアント証明書を準備する
オプション 1: クライアント証明書を申請する
プライベート証明書を申請する を参照して、クライアント証明書を申請します。
証明書サービスコンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。[PCA 証明書管理] ページで、PCA サービスが配置されているリージョンを選択します。
プライベートca タブで、使用するプライベート中間 CA を見つけ、操作 列の アプリケーション証明書 をクリックします。

アプリケーション証明書 パネルで、パラメーターを設定し、申請の確認 をクリックします。次の表にパラメーターを示します。
このガイドでは、クライアント証明書を申請する際に、証明書のタイプ を クライアント証明書 に設定し、氏名 (クライアントユーザーの一意の識別子として使用) を指定します。クライアント証明書を申請する際の他のパラメーター はデフォルト設定のままにするか、必要に応じて変更します。

証明書申請を送信すると、プライベート証明書がすぐに発行されます。その後、操作 列の 証明書リスト をクリックして、プライベート証明書の情報を表示できます。
オプション 2: 自己署名 CA 証明書をアップロードする
ECS01 にリモートでログインし、次のコマンドを使用して自己署名ルート CA 証明書を生成します。
ALB は、相互認証のために自己署名ルート CA または自己署名中間 CA 証明書をサポートします。このガイドでは、自己署名ルート CA 証明書を使用します。
次のコマンドを使用して、ルート CA 証明書の秘密鍵を作成します:
openssl genrsa -out root.key 4096次のコマンドを使用して、ルート CA 証明書を要求するためのファイルを作成します:
openssl req -new -out root.csr -key root.key他のパラメーターを設定します。例:
説明CA 証明書のコモンネームが、クライアント証明書およびサーバー証明書のコモンネームと異なることを確認してください。
Country Name (2 letter code) [XX]:cn State or Province Name (full name) []:bj Locality Name (eg, city) [Default City]:bj Organization Name (eg, company) [Default Company Ltd]:alibaba Organizational Unit Name (eg, section) []:test Common Name (eg, your name or your servers hostname) []:root Email Address []:a****@example.com A challenge password []: An optional company name []:次のコマンドを使用して、ルート CA 証明書を作成します:
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650出力例:

lsコマンドを使用して、生成されたルート CA 証明書root.crtとルート CA 証明書の秘密鍵root.keyを確認します。これらのルート CA 証明書ファイルをローカルコンピューターに ダウンロード して、後で Certificate Management Service にアップロードできるようにします。
自己署名ルート CA 証明書を Certificate Management Service にアップロードします。
Certificate Management Service にログインします。
左側のナビゲーションウィンドウで、 を選択します。
証明書アプリケーションリポジトリ ページで、[リポジトリの作成] をクリックします。[リポジトリの作成] パネルで、[データソース] を [アップロードされた CA 証明書] に設定し、[OK] をクリックします。

証明書アプリケーションリポジトリ ページで、作成した証明書リポジトリをクリックします。
[公式証明書] ページで、[アップロードされた証明書] をクリックします。[CA 情報] パネルで、ルート CA 証明書ファイル
root.crtをアップロードし、[確認して有効化] をクリックします。
2. クライアント証明書をエクスポートする
オプション 1: Certificate Management Service を通じて購入したクライアント証明書をエクスポートする
Certificate Management Service を通じてクライアント証明書を購入し、そのクライアント証明書を相互認証に使用する場合は、次の操作を実行してクライアント証明書をエクスポートします:
左側のナビゲーションウィンドウで、[PCA 証明書管理] を選択します。プライベートca タブで、必要なプライベート証明書が発行されたプライベート中間 CA を見つけ、操作 列の 証明書リスト をクリックします。

証明書リスト ページで、ダウンロードするプライベート証明書を見つけ、操作 列の ダウンロード をクリックします。
証明書のダウンロード ダイアログボックスで、[証明書フォーマット] パラメーターを設定し、確認してダウンロードする をクリックします。信頼チェーンを含める をオンにすると、ダウンロードされる証明書には完全な証明書チェーンが含まれます。
このガイドでは、証明書フォーマット をブラウザで認識できる [PFX] に設定します。

次の図に示すように、ダウンロードされた証明書ファイルには、
.pfx拡張子を持つクライアント証明書ファイルと、.txtファイル内のクライアント秘密鍵暗号化パスワードが含まれています。
オプション 2: 自己署名証明書から生成されたクライアント証明書をエクスポートする
自己署名 CA 証明書を Certificate Management Service にアップロードし、その自己署名 CA 証明書から生成されたクライアント証明書を相互認証に使用する必要がある場合は、次の操作を実行してクライアント証明書を生成します:
ECS01 にリモートでログインし、次の手順を実行してクライアント証明書を生成します。
次のコマンドを使用して、クライアント証明書キーを生成します:
openssl genrsa -out client.key 4096次のコマンドを使用して、クライアント証明書を要求するためのファイルを生成します:
openssl req -new -out client.csr -key client.key他のパラメーターを設定します。例:
説明CA 証明書のコモンネームが、サーバー証明書、ルート証明書、および他のクライアント証明書のコモンネームと異なることを確認してください。
Country Name (2 letter code) [XX]:cn State or Province Name (full name) []:bj Locality Name (eg, city) [Default City]:bj Organization Name (eg, company) [Default Company Ltd]:alibaba Organizational Unit Name (eg, section) []:test Common Name (eg, your name or your servers hostname) []:client-alb-user Email Address []:username@example.com A challenge password []: An optional company name []:次のコマンドを使用して、クライアント証明書を生成します。
openssl x509 -req -in client.csr -out client.crt -CA root.crt -CAkey root.key -CAcreateserial -days 3650出力例:

次のコマンドを使用して、生成されたクライアント証明書
client.crtをブラウザで認識できる PKCS12 ファイルに変換します。プロンプトに従って、設定したクライアント秘密鍵の暗号化パスワードを入力します。openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12lsコマンドを使用して、生成されたclient.p12クライアント証明書ファイルを確認します。クライアント証明書ファイルをローカルコンピューターに ダウンロード して、後でクライアントに送信できるようにします。
ステップ 2: 相互認証を有効にした HTTPS リスナーを設定する
ALB コンソール の上部のナビゲーションバーで、ALB インスタンスが配置されているリージョンを選択します。[インスタンス] ページで、ALB インスタンスを見つけてその ID をクリックします。
インスタンスの詳細ページで、[リスナー] タブをクリックし、[リスナーの作成] をクリックして、次の設定を完了してから [次へ] をクリックします。
このガイドでは、[リスナープロトコル] を [HTTPS] に、[リスナーポート] を [443] に設定します。他の HTTPS リスナーパラメーター はデフォルト値のままにするか、必要に応じて変更します。

[SSL 証明書の設定] ステップで、購入したサーバー証明書を選択します。[相互認証を有効化] をオンにし、CA 証明書ソースと CA 証明書を選択します。TLS セキュリティポリシーを選択し、[次へ] をクリックします。
[CA 証明書ソース] が [Alibaba Cloud] に設定されている場合は、[デフォルト CA 証明書] ドロップダウンリストから ステップ 1: クライアント証明書をデプロイする で申請した CA 証明書を選択します。
[CA 証明書ソース] が [サードパーティ] に設定されている場合は、[デフォルト CA 証明書] ドロップダウンリストから ステップ 1: クライアント証明書をデプロイする でアップロードした自己署名 CA 証明書を選択します。
次の図は、Alibaba Cloud が発行した CA 証明書を選択する例を示しています。

[サーバーグループの選択] ステップで、右側のドロップダウンリストから [サーバータイプ] と作成したサーバーグループを選択します。バックエンドサーバー ECS01 と ECS02 の情報を確認し、[次へ] をクリックします。
[設定の確認] ステップで、設定情報を確認し、[送信] をクリックします。
ステップ 3: DNS レコードを追加する
ビジネスのために、カスタムドメイン名を ALB インスタンスのドメイン名にマッピングするために DNS レコードを追加することをお勧めします。
ALB コンソール の左側のナビゲーションウィンドウで、 を選択します。[インスタンス] ページで、ALB インスタンスの DNS 名をコピーします。
CNAME レコードを追加します。
Authoritative DNS Resolution ページで、カスタムドメイン名を見つけ、[操作] 列の [DNS 設定] をクリックします。
説明Alibaba Cloud に登録されていないドメイン名の場合、DNS 解決を設定する前に、まず Alibaba Cloud DNS に ドメイン名を追加 する必要があります。
[DNS 設定] ページで、[DNS レコードの追加] をクリックし、CNAME レコードを設定してから、[OK] をクリックします。
このガイドでは、[レコードタイプ] を [CNAME] に、[レコード値] を ALB インスタンスの DNS 名に設定します。他の DNS レコードパラメーター はデフォルト値のままにするか、必要に応じて変更します。

ステップ 4: 相互認証の効果をテストする
このガイドでは、Windows クライアントとその上の Chrome ブラウザを使用してテストします。
クライアントに エクスポートされたクライアント証明書 をインストールします。
ダウンロードしたクライアント証明書ファイルをダブルクリックし、システム証明書インポートウィザードのプロンプトに従ってインストールを完了します。
Chrome ブラウザのアドレスフィールドに
https://<Your custom domain name>を入力します。表示されるダイアログボックスで、クライアント認証に使用する証明書を選択します。
ページを複数回更新します。ECS01 と ECS02 からの応答が交互に返される場合、相互認証が実装されています。


参考
コンソール
ALB コンソールでの証明書の管理と使用:
Certificate Management Service コンソールでの CA 署名証明書の購入と自己署名証明書の作成:
API
次の API 操作を呼び出し、CaEnabled パラメーターを true に設定して相互認証を有効にします: