Network Load Balancer (NLB) は大規模な SSL オフロードをサポートします。イングレスに NLB インスタンスをデプロイし、SSL 証明書および CA 証明書を設定することで、相互認証を有効化できます。このプロセスにより接続の両者が認証され、ワークロードのセキュリティが強化されます。
背景情報
-
一方向認証:クライアントがサーバーを認証しますが、サーバーはクライアントを認証しません。クライアントはサーバーの公開鍵証明書を要求・検証し、安全な通信チャネルを確立します。
-
相互認証:クライアントとサーバーが互いを認証します。クライアントはサーバーの公開鍵証明書を検証し、サーバーはクライアントの証明書を検証します。両方の認証が成功した場合にのみ、安全な通信チャネルが確立されるため、相互認証はサービスに対してより強固なセキュリティを提供します。
前提条件
-
NLB インスタンスが作成されています。詳細については、「NLB インスタンスの作成と管理」をご参照ください。
-
ECS インスタンスを 3 台作成済みである必要があります。詳細については、「ウィザードを使用したインスタンスの作成」をご参照ください。
-
ECS01 および ECS02 は NLB インスタンスのバックエンドサーバーとして機能し、それぞれ異なるアプリケーションサービスがデプロイされています。
-
ECS03 を使用して自己署名のサーバー証明書およびクライアント証明書を生成します。OpenSSL 公式ウェブサイトから OpenSSL ツール (バージョン 1.1.1 以降) をダウンロードし、ECS03 にインストールする必要があります。既存の Linux サーバーを使用して自己署名証明書を作成することも可能です。その場合は、ECS03 インスタンスを作成する必要はありません。
-
-
NLB インスタンス用のサーバーグループを作成し、ECS01 および ECS02 を追加済みである必要があります。この例では、ECS01 および ECS02 のバックエンドポートはいずれも 80 に設定されています。
重要サーバーグループのバックエンドプロトコルは TCP である必要があります。NLB はバックエンドサーバーにトラフィックを送信する前に復号処理を行います。そのため、バックエンドサーバー側で SSL 復号を行う必要はありません。
TCP 上の SSL を使用するリスナーは、クライアントアドレスの保持 機能が有効化されたサーバーグループに関連付けることはできません。サーバーグループでこの機能が無効になっていることを確認してください。
ステップ 1:CA 証明書の準備
-
Certificate Management Service コンソールにログインします。
-
左側のナビゲーションウィンドウで、PCA 証明書管理 をクリックします。
-
PCA 証明書管理 ページで、プライベートca タブをクリックし、対象のルート CA 証明書を見つけます。
-
対象のルート CA 証明書の横にある
アイコンをクリックし、対象のプライベート中間 CA を見つけ、アプリケーション証明書 を 操作 列でクリックします。 -
アプリケーション証明書 パネルで、以下のパラメーターを設定し、申請の確認 をクリックします。
ここでは、このトピックと関係性の高いパラメーターのみを記載しています。証明書の申請方法の詳細については、「プライベート証明書の管理」をご参照ください。
パラメーター
説明
証明書タイプ
プライベート証明書のタイプを選択します。この例では、クライアント証明書 を選択します。
氏名
このパラメーターはクライアント証明書の場合にのみ必須です。クライアントユーザーの一意な識別子として機能します。
この例では、作成済みの NLB インスタンスのドメイン名を入力します。
有効期間
プライベート証明書の有効期間です。この期間は、プライベート CA のサブスクリプション期間を超えることはできません。
この例では、デフォルト値の 30 日を使用します。
証明書の申請を送信すると、証明書は即時に発行されます。その後、対象のプライベート CA を見つけ、証明書リスト を 操作 列でクリックし、証明書リスト ページで発行済み証明書を確認できます。
ステップ 2:サーバー証明書の準備
ブラウザは、サーバーの証明書が信頼できる CA によって発行されているかどうかを確認することで、サーバーの ID を検証します。このトピックでは、サーバー証明書を取得する方法として、Certificate Management Service から購入する方法と、自己署名のサーバー証明書を Certificate Management Service にアップロードする方法の 2 つについて説明します。
購入済み証明書
Certificate Management Service コンソール または他のサービスプロバイダーからサーバー証明書を購入できます。詳細については、「SSL 証明書の購入」をご参照ください。
自己署名証明書
-
ECS03 インスタンスにログインし、以下のコマンドを実行して自己署名のサーバー証明書を生成します。CA 証明書ファイル
root.crtおよびroot.keyが ECS03 インスタンス上にあることを確認してください。-
以下のコマンドを実行して、サーバー証明書用の秘密鍵を生成します。
sudo openssl genrsa -out server.key 4096 -
以下のコマンドを実行して、証明書署名要求 (CSR) を生成します。
sudo openssl req -new -out server.csr -key server.keyプロンプトが表示されたら、必要な情報を入力します。以下に例を示します。
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) []:www.example.com Email Address []:a.alibaba.com A challenge password []: An optional company name []:重要サーバー証明書を生成する際は、Common Name に証明書用のドメイン名を設定してください。ドメイン名が有効であることを確認してください。その他のパラメーター値は、ルート証明書およびクライアント証明書を指定する際に使用したものと一致している必要があります。
このトピックでは、NLB インスタンスがカスタムドメイン名
www.example.comを使用してインターネットにサービスを提供します。Common Name はカスタムドメイン名www.example.comです。 -
以下のコマンドを実行して、サーバー証明書を生成します。
sudo openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650出力:
Signature ok subject=/C=cn/ST=bj/L=bj/O=alibaba/OU=test/CN=www.example.com/emailAddress=a.alibaba.com Getting Private key Getting CA Private Key -
以下のコマンドを実行して、サーバー証明書ファイルを保存するディレクトリを作成します。
sudo mkdir -p /root/ssl -
以下のコマンドを実行して、サーバー証明書およびその秘密鍵を対象ディレクトリにコピーします。
sudo cp server.crt /root/ssl sudo cp server.key /root/ssl -
以下のコマンドを実行して、生成されたサーバー証明書
server.crtおよびその秘密鍵server.keyを表示します。cd /root/ssl ls出力:
root.crt root.csr root.key root.srl server.crt server.csr server.key
-
-
この例では Windows クライアントを使用します。コマンドラインインターフェイス (CLI) ウィンドウを開き、以下のコマンドを実行して、この ステップで作成したサーバー証明書ファイルをローカルデスクトップにコピーします。
scp root@IPaddress:/root/ssl/server.crt C:\Users\Public\Desktop # IPaddress は、サーバー証明書を作成したサーバーの IP アドレスです。 scp root@IPaddress:/root/ssl/server.key C:\Users\Public\Desktop # IPaddress は、サーバー証明書を作成したサーバーの IP アドレスです。 Certificate Management Service コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
-
アップロードされた証明書 タブで、アップロードされた証明書 をクリックします。
-
アップロードされた証明書 パネルで、以下のパラメーターを設定し、OK をクリックします。
詳細については、「SSL 証明書のアップロード、同期、共有」をご参照ください。
パラメーター
説明
証明書アルゴリズム
この例では、国際的に認められたアルゴリズム を選択します。
証明書名
アップロードする証明書の名前を入力します。
証明書ファイル
証明書ファイルの PEM エンコードされた内容を入力します。
テキストエディターを使用して PEM または CRT 形式の証明書ファイルを開き、内容をこのテキストボックスにコピー&ペーストすることもできます。または、アップロードされたファイルの解析 をクリックして、ローカルコンピューターから証明書ファイルを選択・アップロードすることもできます。
この例では、コピーしたサーバー証明書ファイル
server.crtをアップロードします。証明書秘密鍵
秘密鍵の PEM エンコードされた内容を入力します。
テキストエディターを使用して KEY 形式の秘密鍵ファイルを開き、内容をこのテキストボックスにコピー&ペーストすることもできます。または、アップロードされたファイルの解析 をクリックして、ローカルコンピューターから秘密鍵ファイルを選択・アップロードすることもできます。
この例では、コピーした秘密鍵ファイル
server.keyをアップロードします。証明書チェーン
証明書チェーンの内容です。この例では、このパラメーターは設定しません。
ステップ 3:クライアント証明書の準備
以下のいずれかの方法を使用して、クライアント証明書を準備します。
-
Certificate Management Service コンソールにログインします。
-
左側のナビゲーションウィンドウで、PCA 証明書管理 をクリックします。
-
PCA 証明書管理 ページで、プライベートca タブをクリックし、対象のルート CA 証明書を見つけます。
ルート CA 証明書の購入方法については、「プライベート CA の購入と有効化」をご参照ください。
-
対象のルート CA 証明書の横にある
アイコンをクリックし、対象の下位 CA 証明書を見つけ、証明書リスト を 操作 列でクリックします。 証明書リスト ページで、対象のプライベート証明書を見つけ、操作 列で ダウンロード をクリックします。
-
証明書のダウンロード ダイアログボックスで、証明書形式を選択し、確認してダウンロードする をクリックします。この例では、CRT を選択します。ダウンロードが完了すると、クライアント証明書の名前は
client.crt、証明書の秘密鍵の名前はclient.keyになります。 -
クライアント証明書をブラウザが認識可能な PKCS12 ファイルに変換します。
-
ECS03 インスタンスにリモートログインします。詳細については、「接続方法」をご参照ください。
-
以下のコマンドを実行して、クライアント証明書を保存するディレクトリを作成します。
sudo mkdir -p /root/ca/users -
生成された
client.crtおよびclient.keyファイルを users ディレクトリにアップロードします。 -
以下のコマンドを実行して、クライアント証明書を PKCS12 ファイルに変換します。
sudo openssl pkcs12 -export -clcerts -in /root/ca/users/client.crt -inkey /root/ca/users/client.key -out /root/ca/users/client.p12 -
プロンプトが表示されたら、証明書の秘密鍵の暗号化パスワードを設定します。
-
証明書のエクスポート用パスワードを入力します。このパスワードは、クライアント証明書をインストールする際に必要です。
出力:
Enter pass phrase for /root/ca/users/client.key: Enter Export Password: Verifying - Enter Export Password:
-
-
以下のコマンドを実行して、生成されたクライアント証明書を表示します。
cd /root/ca/users ls出力:
client.crt client.key client.p12 -
この例では Windows クライアントを使用します。ローカルコンピューターでコマンドラインツールを開き、以下のコマンドを実行して、生成されたクライアント証明書をエクスポートします。
scp root@IPaddress:/root/ca/users/client.p12 C:\Users\Public\Desktop #IPaddress は、クライアント証明書を生成したサーバーの IP アドレスです。
ステップ 4:クライアント証明書のインストール
生成されたクライアント証明書をクライアントにインストールします。このトピックでは、Windows クライアントおよび Linux クライアントへの証明書インストール方法について説明します。
Windows クライアント
ダウンロードしたクライアント証明書を Microsoft Edge にインポートします。
-
Microsoft Edge を開き、右上隅の
をクリックして、設定項目 を選択します。 -
左側のナビゲーションウィンドウで、プライバシー、検索、およびサービス タブをクリックします。セキュリティ セクションで、証明書の管理 をクリックし、ダウンロードした PKCS12 ファイルをインポートします。証明書をインポートする際は、ステップ 3:クライアント証明書のエクスポート で証明書をエクスポートする際に設定したパスワードを入力する必要があります。
Linux クライアント
生成されたクライアント証明書は ECS03 サーバー上のディレクトリに保存されています。別の Linux クライアントで NLB の双方向認証を検証するには、必要な証明書をそのクライアントのディレクトリにコピーします。
-
Linux クライアントにログインし、以下のコマンドを実行して、クライアント証明書、サーバー証明書、およびルート証明書をディレクトリにコピーします。
-
ディレクトリを作成します。
sudo mkdir /root/ca -
ディレクトリの権限を変更します。
sudo chmod 700 /root/ca -
以下のコマンドを実行して、証明書ファイルをコピーします。
以下のパスは例です。実際のパスに置き換えてください。
sudo scp home@IPaddress:/root/ca/users/client.crt /root/ca // IPaddress をソースサーバーの IP アドレスに置き換えます。 sudo scp home@IPaddress:/root/ca/root.crt /root/ca // IPaddress をソースサーバーの IP アドレスに置き換えます。 sudo scp home@IPaddress:/root/ca/root.key /root/ca // IPaddress をソースサーバーの IP アドレスに置き換えます。 sudo scp home@IPaddress:/root/ssl/server.crt /root/ca // IPaddress をソースサーバーの IP アドレスに置き換えます。 sudo scp home@IPaddress:/root/ssl/server.key /root/ca // IPaddress をソースサーバーの IP アドレスに置き換えます。
-
ステップ 5:TCPSSL 相互認証の構成
NLB コンソール にログインします。
-
上部のナビゲーションバーで、NLB インスタンスが配置されているリージョンを選択します。
-
インスタンス ページで、対象のインスタンスを見つけ、リスナーの作成 を 操作 列でクリックします。
-
リスナーの設定 ウィザードで、以下のパラメーターを構成し、次へ をクリックします。
このセクションでは、関連するパラメーターのみについて説明します。その他のすべてのパラメーターはデフォルト設定を使用してください。詳細については、「TCPSSL リスナーの作成」をご参照ください。
パラメーター
説明
リスナープロトコルの選択
リスナープロトコルを選択します。この例では、TCPSSL を選択します。
リスナーポート
リスナーがリクエストを受信し、バックエンドサーバーに転送するために使用するポートを入力します。この例では、443 を入力します。
-
SSL 証明書の設定 ウィザードで、サーバー証明書 ドロップダウンリストから、ステップ 2:サーバー証明書の準備 で購入またはアップロードしたサーバー証明書を選択します。
-
相互認証の有効化 トグルスイッチをオンにし、CA 証明書のソースを Alibaba Cloud 発行に設定してから、デフォルト CA 証明書ドロップダウンリストから購入済みの CA 証明書を選択します。
-
TLS セキュリティポリシー を選択し、次へ をクリックします。
-
サーバーグループの選択 ウィザードで、作成済みのサーバーグループを選択し、バックエンドサーバー (ECS01 および ECS02) の詳細を確認します。この例では、ポートはいずれも 80 に設定されています。その後、次へ をクリックします。
-
設定の確認 ウィザードで、構成を確認し、送信 をクリックします。
ステップ 6:TCPSSL 相互認証の検証
Windows クライアント
-
NLB インスタンス ページで、対象の NLB インスタンスの ID をクリックし、リスナー タブをクリックして、TCPSSL リスナーのヘルスチェックステータスを確認します。
ヘルスチェックステータス 列に 正常 と表示されている場合、バックエンドサーバーは TCPSSL リスナー からのリクエストを処理できます。
-
ブラウザのアドレスバーに
https://<サーバー証明書にバインドされたドメイン名>を入力します (例:https://www.example.com)。表示されるダイアログボックスで、クライアント証明書を選択し、OK をクリックします。
-
レイヤー 4 負荷分散を検証する際にブラウザのキャッシュによる問題を回避するため、ドメイン名にアクセスする際はプライベートウィンドウまたはシークレットウィンドウを使用してください。リクエストが 2 つの ECS インスタンス間で分散され、交互に Hello World ! This is ECS01. および Hello World ! This is ECS02. が返されることが確認できます。
Linux クライアント
ルート証明書、サーバー証明書、およびクライアント証明書を保存している Linux クライアントにログインし、以下のコマンドを実行して NLB 相互認証を検証します。
sudo curl --cert /root/ca/client.crt --key /root/ca/client.key --cacert /root/ca/root.crt www.example.com
www.example.com は、NLB インスタンスのサーバー証明書にバインドされたドメイン名です。
以下のような応答が返された場合、相互認証が完了し、リクエストが両方の ECS インスタンスに分散されていることを示します。
$ sudo curl --cert /root/ca/client.crt --key /root/ca/client.key --cacert /root/ca/root.crt https://www.example.com
Hello World ! This is ECS01.
$ sudo curl --cert /root/ca/client.crt --key /root/ca/client.key --cacert /root/ca/root.crt https://www.example.com
Hello World ! This is ECS02.