Network Load Balancer (NLB) は、大規模なSSLオフロードをサポートします。 NLBインスタンスをトラフィックの入口としてデプロイし、SSL証明書と認証局 (CA) 証明書を設定して相互認証を有効にすることができます。これにより、クライアントとサーバーの両方がデジタル証明書を提供してIDを証明する必要があります。 これにより、ワークロードのセキュリティが向上します。
背景情報
一方向認証: クライアントはサーバーのIDを確認する必要があります。 サーバは、クライアントのアイデンティティを検証する必要はない。 クライアントは、認証のために公開鍵証明書をサーバからダウンロードする。 接続は、サーバのアイデンティティが検証された後にのみ確立することができる。
相互認証: クライアントはサーバーからサーバー証明書 (公開鍵証明書) をダウンロードし、認証のためにクライアント証明書 (公開鍵証明書) をサーバーにアップロードします。 接続は、クライアントとサーバの両方のアイデンティティが検証された後にのみ確立することができる。 相互認証は、より高いセキュリティを提供する。
前提条件
NLBインスタンスが作成されました。 詳細については、「NLBインスタンスの作成と管理」をご参照ください。
3つのECS (Elastic Compute Service) インスタンスが作成されます。 インスタンスの作成方法については、「ウィザードを使用したインスタンスの作成」をご参照ください。
ECS01とECS02はバックエンドサーバーとしてNLBインスタンスに追加されます。 ECS01とECS02には異なるNGINXアプリケーションがデプロイされています。
ECS03は、自己署名サーバー証明書とクライアント証明書の生成に使用されます。 OpenSSLはOpenSSLサイトからダウンロードされ、ECS03にインストールされます。 OpenSSLのバージョンは1.1.1以降です。 既存のLinuxサーバーを使用して自己署名証明書を生成する場合、ECS03を作成する必要はありません。
NLBインスタンスに対してTCPサーバーグループが作成され、ECS01とECS02がサーバーグループに追加されます。 この例では、ECS01とECS02のバックエンドポートは80に設定されています。
手順
ステップ1: CA証明書の準備
証明書管理サービスコンソールにログインします。
左側のナビゲーションウィンドウで、プライベート証明書 をクリックします。
プライベート証明書 ページで、プライベートca タブをクリックし、ルートCA証明書を見つけます。
ルートCA証明書の横にあるアイコンをクリックし、管理するプライベート中間CAを見つけて、[操作] 列の [証明書の申請] をクリックします。
[証明書の申請] パネルでパラメーターを設定し、申請の確認 をクリックします。
次のセクションでは、このトピックに関連するパラメーターについて説明します。 詳細については、「プライベート証明書の管理」をご参照ください。
パラメーター
説明
証明書タイプ
購入するプライベート証明書の種類を選択します。 この例では、クライアント証明書が選択されています。
共通名 (CN)
プライベート証明書ホルダーの共通名を指定します。 クライアント証明書の電子メールまたはURLを指定できます。
この例では、NLBインスタンスのドメイン名が使用されます。
購入期間
プライベート証明書の有効期間を指定します。 プライベート証明書の有効期間は、購入したPCA (private certificate Authority) サービスのサブスクリプション期間を超えることはできません。
この例では、デフォルトの有効期間 (30日) が使用されます。
プライベート証明書は、リクエストが送信された直後に発行されます。 プライベート証明書の詳細を表示するには、プライベートCAを見つけ、[操作] 列の 証明書リスト をクリックし、[証明書] ページで情報を表示します。
ステップ2: サーバー証明書の準備
ブラウザは、サーバによって送信された証明書が信頼できるCAによって発行されたものであるかどうかをチェックすることによって、サーバの識別を検証する。 このトピックでは、サーバー証明書の取得に使用できる2つの方法について説明します。 証明書管理サービスからサーバー証明書を購入するか、証明書管理サービスに自己署名証明書をアップロードできます。
方法1: サーバー証明書を購入する
サーバー証明書は、[証明書管理サービス] または他のサービスプロバイダーから購入できます。 詳細については、「SSL証明書の購入」をご参照ください。
方法2: 自己署名サーバー証明書をアップロードする
リモートでECS03にログオンし、次のコマンドを実行して自己署名サーバー証明書を生成します。 CA証明書がECS03に保存されていることを確認します。 この例で使用されるCA証明書ファイルは、
root.crt
とroot.key
です。次のコマンドを実行して、サーバー証明書の秘密鍵を生成します。
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 []:
重要サーバー証明書に関連付けられているドメイン名に共通名を設定します。 ドメイン名が有効であることを確認してください。 その他のパラメーターの値は、ルート証明書およびクライアント証明書の値と同じにします。
この例では、NLBインスタンスはカスタムドメイン名
www.example.com
を使用して外部サービスを提供します。 したがって、共通名は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
次の図は結果を示しています。
次のコマンドを実行して、サーバー証明書ファイルを保存するフォルダーを作成します。
sudo mkdir -p /root/ssl
次のコマンドを実行して、サーバー証明書をフォルダーにコピーします。
sudo cp server.crt /root/ssl sudo cp server.key /root/ssl
次のコマンドを実行して、サーバー証明書
server.crt
とサーバー証明書の秘密鍵server.key
を表示します。sudo cd /root/ssl ls
次の図は結果を示しています。
この例では、Windowsクライアントが使用されます。 Windowsクライアントでコマンドラインインターフェイス (CLI) を開き、次のコマンドを実行して、ステップ1で生成されたサーバー証明書ファイルをローカルファイルにエクスポートします。
scp root@IPaddress:/root/ssl/server.crt /C:/Users/test //IPaddress indicates the IP address of the server that generates the root CA certificate. scp root@IPaddress:/root/ssl/server.key /C:/Users/test //IPaddress indicates the IP address of the server that generates the root CA certificate.
Certificate Management Serviceコンソールにログインします。
左側のナビゲーションウィンドウで、を選択します。
アップロード証明書 タブで、アップロード証明書 をクリックします。
アップロード証明書 パネルで、次のパラメーターを設定し、[OK] をクリックします。
詳細については、「SSL証明書のアップロード」をご参照ください。
パラメーター
説明
証明書アルゴリズム
この例では、国際的に受け入れられたアルゴリズムが選択される。
証明書名
アップロードする証明書の名前を入力します。
証明書ファイル
PEMエンコードされたCA証明書ファイルの内容を入力します。
次のいずれかの方法でコンテンツを入力できます。 方法1: テキストエディターを使用して、PEMまたはCRT形式のCA証明書ファイルを開きます。 次に、Certificate Fileフィールドにコンテンツをコピーします。 方法2: [証明書ファイル] フィールドの下にある [アップロード] をクリックします。 次に、コンピューターからCA証明書ファイルを選択して、ファイルの内容をアップロードします。
この例では、サーバー証明書ファイル
server.crt
がアップロードされます。証明書秘密鍵
PEMエンコードされた秘密鍵ファイルの内容を入力します。
次のいずれかの方法でコンテンツを入力できます。 方法1: テキストエディタを使用して、秘密鍵ファイルをkey形式で開きます。 次に、コンテンツを [秘密鍵の追加] フィールドにコピーします。 方法2: [秘密鍵の追加] フィールドの下にある [アップロード] をクリックします。 次に、コンピューターから秘密鍵ファイルを選択して、ファイルのコンテンツをアップロードします。
この例では、秘密鍵ファイル
server.key
がアップロードされています。証明書チェーン
証明書チェーンファイルの内容を入力します。 この例では、このパラメーターは無視されます。
ステップ3: クライアント証明書の準備
次のいずれかの方法を使用して、ビジネス要件に基づいてクライアント証明書を準備できます。
証明書管理サービスコンソールにログインします。
左側のナビゲーションウィンドウで、プライベート証明書 をクリックします。
プライベート証明書 ページで、プライベート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
指示に従って、証明書秘密鍵の暗号化鍵を設定します。
クライアント証明書のエクスポートに使用するパスワードを入力します。 このパスワードは、クライアント証明書の暗号化に使用され、クライアント証明書のインストールに必要です。
次の図は結果を示しています。
次のコマンドを実行して、生成されたクライアント証明書を表示します。
sudo cd /root/ca/users ls
次の図は結果を示しています。
CLIを開き、次のコマンドを実行してクライアント証明書をエクスポートします。
scp root@IPaddress:/root/ca/users/client.p12 ./ //IPaddress indicates the IP address of the server that generates the client certificate.
手順4: クライアント証明書のインストール
クライアントにクライアント証明書をインストールします。 この例では、WindowsクライアントとLinuxクライアントを使用して、クライアント証明書をインストールする方法を示します。
Windowsクライアント
クライアント証明書をMicrosoft Edgeにインポートします。
Microsoft Edgeを開き、を選択します。
左側のナビゲーションウィンドウで、[プライバシー、検索、サービス] タブをクリックします。 次に、[セキュリティ] セクションで [証明書の管理] をクリックし、PKCS12ファイルをインポートします。 このステップでは、ステップ3: クライアント証明書の準備でクライアント証明書をエクスポートするために使用されるパスワードを入力する必要があります。
Linuxクライアント
ECS03を使用してクライアント証明書を生成する場合、クライアント証明書はECS03のディレクトリに格納されます。 別のLinuxクライアントを使用してクライアント証明書を生成する場合は、次の手順を実行して、まず証明書をLinuxクライアントのディレクトリにコピーします。
Linuxクライアントにログオンします。 次のコマンドを実行して、クライアント証明書、サーバー証明書、およびルート証明書をディレクトリにコピーします。
次のコマンドを実行してフォルダを作成します。
sudo mkdir /root/ca
次のコマンドを実行して、ディレクトリの権限を変更します。
sudo chmod 700 /root/ca
次のコマンドを実行して、証明書をLinuxクライアントディレクトリにコピーします。
次のパスは参照専用です。 使用する実際のパスを指定します。
sudo scp home@IPaddress:/root/ca/users/client.crt /root/ca //IPaddress indicates the IP address of the server that generates the client certificate. sudo scp home@IPaddress:/root/ca/root.crt /root/ca //IPaddress indicates the IP address of the server that generates the root certificate. sudo scp home@IPaddress:/root/ca/root.key /root/ca //IPaddress indicates the IP address of the server that generates the root certificate. sudo scp home@IPaddress:/root/ssl/server.crt /root/ca //IPaddress indicates the IP address of the server that generates the server certificate. sudo scp home@IPaddress:/root/SSL/server.crt /root/ca //IPaddress indicates the IP address of the server that generates the server certificate.
手順5: SSL over TCPを使用するリスナーの相互認証の設定
NLBコンソールにログインします。
上部のナビゲーションバーで、NLBインスタンスを作成します。
[インスタンス] ページで、NLBインスタンスを見つけ、リスナーの作成 列の 操作 をクリックします。
リスナーの設定ステップで、次のパラメータを設定し、次へをクリックします。
次の表に、一部のパラメーターのみを示します。 他のパラメーターはデフォルト値を使用します。 詳細については、「TCP経由でSSLを使用するリスナーの作成」をご参照ください。
パラメーター
手順
リスナープロトコルの選択
リスナープロトコルを選択します。 この例では、TCPSSLが選択されています。
リスナーポート
NLBインスタンスがリッスンするポートを指定します。 NLBインスタンスは、ポートを使用してリクエストを受信し、リクエストをバックエンドサーバーに転送します。 この例では、ポート443が使用される。
SSL証明書の設定ステップで指定されたサーバー証明書を選択します。ステップ2: サーバー証明書の準備からサーバー証明書ドロップダウンリスト。
詳細設定で相互認証の有効化を有効にする
. CA証明書のソースをAlibaba Cloudに設定し、手順1で購入したCA証明書を選択します。
TLS セキュリティポリシーをを選択し、次へをクリックします。
[サーバーグループの選択] ステップで、作成したサーバーグループを選択し、バックエンドサーバーECS01およびECS02に関する情報を表示します。 この例では、バックエンドサーバーのポートは80に設定されています。 次に、次へ をクリックします。
構成レビューステップで、設定を確認し、送信をクリックします。
ステップ6: 相互認証の検証
Windowsクライアント
[NLB] インスタンス ページに移動し、管理する [NLB] インスタンスのIDをクリックし、[リスナー] タブをクリックして、SSL over TCPを使用するリスナーのヘルスチェックステータスを表示します。
ヘルスチェックステータス列に [Healthy] と表示された場合、バックエンドサーバーはNLBリスナーによって転送されたリクエストを処理できます。
入力
https:// サーバー証明書に関連付けられたドメイン名
ブラウザのアドレスバーに、たとえば、https://www.example.com
. 表示されるダイアログボックスで、クライアントのIDの検証に使用する証明書を選択し、[OK] をクリックします。
ブラウザでのキャッシュによる問題を回避するには、レイヤー4の負荷分散をテストするときに、プライベートブラウジングモードでドメイン名にアクセスすることをお勧めします。 結果は、要求がECS01およびECS02に分配されたことを示す。
Linuxクライアント
ルート証明書、サーバー証明書、およびクライアント証明書が保存されているLinuxクライアントにログインし、次のコマンドを実行して相互認証をテストします。
sudo curl --cert /root/ca/client.crt --key /root/ca/client.key --cacert /root/ca/root.crt www.example.com
www.example.com
は、サーバー証明書に関連付けられているドメイン名です。
次のエコー応答パケットは、クライアントとサーバの両方が相互認証をパスし、要求がECS01とECS02に分配されたことを示す。